2016-07-14 3 views
0

NSUserDefaultsを使ってアプリケーションに保存されているデータを保存する方法が正しいかどうか疑問に思っていました。データはそれほど多くはありませんが、これは良い解決策になるかもしれません。現在、アプリケーション内のオブジェクトにデータを格納しています。オブジェクトは、ユーザーが設定した後に配列にロードされます。NSUserDefaults Swiftでデータを保存する

var placesChosen: [Place] = [] 
var myplaces: Place = Place() 

class Place { 
    var name: String? 
    var locationAddress: String? 
    var locationPhoneNumber: String? 
} 

function createPlace(){ 
    // code to add place 
    placeChosen.append("some data to add") 

} 

私は後でNSUserDefaultsによって保存されたデータから引くとバックユーザーにデータを表示したいと思います。さらに私は、ユーザーがオブジェクトを配列に設定することしかできないと言及する必要がありますが、

+1

これは可能ですが、 'Place'クラスは' NSCoding'を採用する必要があります – Paulw11

+1

'NSUserDefaults'にデータを保存しないでください。データをファイルに書き込みます。 – rmaddy

+0

"_データはあまり有名ではありません"と言うときは、NSUserDefautlsを1MB未満の小さなデータにのみ使用するように注意してください。あなたのケースでは、いくつかのケースで完全なオブジェクトを保存する予定がある場合は、NSUserDefaultsの完全なオブジェクトを取得/設定すると高価になる可能性があります。 Anotheオプションは、ファイルに書き込むか、CoreDataを使用することができます –

答えて

1

大量のデータをNSUserDefaultsに保存することはお勧めしません。 NSUserDefaultsは、ユーザーの好みのような小さなデータを格納するためのものです。

まだ進めたい場合は、Playgroundでコンパイルした以下のコードを使用できます。


//: Playground - noun: a place where people can play 

import UIKit 

// Update your class to add encoder and decoder 
class Place: NSObject, NSCoding { 
    var name: String? 
    var locationAddress: String? 
    var locationPhoneNumber: String? 

    init(name:String, locationAddress: String,locationPhoneNumber: String) { 
     self.name = name 
     self.locationAddress = locationAddress 
     self.locationPhoneNumber = locationPhoneNumber 
    } 

    required convenience init(coder aDecoder: NSCoder) { 

     let name = aDecoder.decodeObjectForKey("name") as! String 
     let locationPhoneNumber = aDecoder.decodeObjectForKey("locationphonenumber") as! String 
     let locationAddress = aDecoder.decodeObjectForKey("locationaddress") as! String 
     self.init(name: name, locationAddress: locationAddress, locationPhoneNumber: locationPhoneNumber) 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(name, forKey: "name") 
     aCoder.encodeObject(locationAddress, forKey: "locationaddress") 
     aCoder.encodeObject(locationPhoneNumber, forKey: "locationphonenumber") 

    } 
} 


//Create your array of chosen place 
let placesChosen = [Place(name: "India",locationAddress: "IndianAddress",locationPhoneNumber:"IndianPhoneNumber"), Place(name: "India",locationAddress: "IndianAddress",locationPhoneNumber:"IndianPhoneNumber")] 


// Add your data to NSUser defaults 
var userDefaults = NSUserDefaults.standardUserDefaults() 
let encodedData = NSKeyedArchiver.archivedDataWithRootObject(placesChosen) 
userDefaults.setObject(encodedData, forKey: "place") 
userDefaults.synchronize() 

// Retrieve your data from NSUserDefaults 
if let decodedData = NSUserDefaults.standardUserDefaults().objectForKey("place") as? NSData { 
    let decodedPlace = NSKeyedUnarchiver.unarchiveObjectWithData(decodedData) as! [Place] 
    print(decodedPlace) 

} 

+1

Adarshに感謝します。 – randomorb2110

+0

@ randomorb2110助けてくれてうれしい!私の答えを受け入れて、それがあなたに役立ったと感じたらそれをアップウォークしてください。 :-) –

0

データをローカルに格納する場合(別の言葉では、データキャッシュの可能性がある)には、多くのソリューションが考慮されます。

まず、データのライフサイクルを考慮する必要があります。ライフサイクルがアプリケーションとともに設定されている場合は、単にグローバル変数としてメモリデータを格納する必要があります。

データを長く保存したい場合は、NSUserDefaults、CoreData、Save files to Diskなどの可能性があります。

NSUserdefaultsは非常に簡単で使いやすい方法です。私は、ユーザーの設定などの軽量データを保存することを前提としています。

CoreDataは強力なツールですが、大規模で複雑な関係データを保存したい場合にのみ使用します。あなたの問題から、私はそれが良いことだとは思わない。

ファイルとしてローカルディスクに保存すると、plistまたは任意の形式のどちらかを使用することができます。これは、大量のデータにも適しています。

単純に言えば、永続的に保存したくない場合は、オブジェクトをグローバル変数として渡すことをお勧めします。それ以外の場合は、NSUserdefaultsまたはローカルディスクのいずれかを使用してください。カスタムオブジェクトの場合、データのシリアル化/非直列化のためのNSCodingプロトコルと、データのエンコーディング/デコードのためのNSKeyedArchiverとNSKeyedUnarchiverを実装する必要があります。

私はこれが役に立ちそうです。

関連する問題