2016-08-15 4 views
0

が、ここにいくつかの背景です:NSManagedObjectIDを永続的に格納する方法は? XYの問題点を回避するために

マイアプリは、ユーザーがちょっとのXcodeのフォントや色チューのような設定の多くを作成して保存することができます:

enter image description here

これは、ユーザーが設定できることはたくさんあります。すべてのものを再び設定するのではなく、保存した設定をタップする方が簡単です。

コアデータを使用して、ユーザーが保存した設定を保存しました。ユーザーが作成した各設定は、NSManagedObjectサブクラスのインスタンスです。そして、今度は、選択した設定を永続的に保存する必要があります。そのため、ユーザーは、アプリが再び開くときに以前と同じ設定が選択されます。

私の最初の考えはNSManagedObjectサブクラスのインスタンスをNSUserDefaultsに保存することでした。しかし、ドキュメントによると、私はNSDataに変換しない限り、私はそれを格納することはできません。

デフォルトのオブジェクトは、プロパティリストである必要があり、それは、(のインスタンスの組み合わせまたはコレクション用)のインスタンスであります:NSData、NSString、NSNumber、NSDate、NSArray、またはNSDictionary。

次に、NSManagedObjectサブクラスインスタンスのobjectIDを保存しようとしました。 URIRepresentation()メソッドがあり、NSURLを返すことがわかります。だから私はこれがうまくいくと思った:

NSData(contentsOfURL: selectedOption!.objectID.URIRepresentation()) 

しかし、初期化子は何とか失敗した。

今私はそれをNSDataに変換することができますが、NSDataNSManagedObjectIDに戻すことができないので、これはばかげたアイデアです。

this questionによると、OPは、オブジェクトIDを保存することができるように思わ:

時にアプリを再起動すると、選択したテーマは無傷のままになるように、私はNSUserDefaultsで選択したテーマのオブジェクトIDを格納します。

どうすればいいですか?

+0

URIRepresentationの文字列値をNSUserDefaultsに保存するだけで済みます。後でその文字列をロードし、 'managedObjectIDForURIRepresentation'を使用してNSObjectIdを取得し、次に' objectWithID'を使用してNSManagedObjectを取得することができます – Paulw11

+0

@ Paulw11どのように文字列を対応するNSManagedObjectに変換できますか? – Sweeper

+0

私が言ったように、 'managedObjectIDForURIRrepresentation'へのURLを提供することによってオブジェクトを提供することは' objectWithID'に返されます。 – Paulw11

答えて

3

NSUserDefaultsURIRepresentation()によって したもののようなNSURLを格納および取得することを可能にする "便利なメソッド"

public func setURL(url: NSURL?, forKey defaultName: String) 
public func URLForKey(defaultName: String) -> NSURL? 

を有しています。 NSData への変換は透過的に処理されます。 documentationから:NSURLは-[NSUserDefaults setURL:forKey:]使用して保存されている

、いくつかの調整が行われます。

  1. どれ非ファイルURLがルート オブジェクトとしてNSURLのインスタンスを使用して+[NSKeyedArchiver archivedDataWithRootObject:]を呼び出すことによって書かれています。
  2. ...

NSURLが-[NSUserDefaults URLForKey:]を使用して読み込まれると、次のロジックが使用されます。

  1. キーの値がNSDataのであれば、NSDataのは、引数として使用されています+[NSKeyedUnarchiver unarchiveObjectWithData:]。 NSDataをNSURLとしてアーカイブ解除できる場合はNSURLが返されます。そうでない場合はnilが返されます。

    if let url = NSUserDefaults.standardUserDefaults().URLForKey("selected"), 
        let oid = context.persistentStoreCoordinator!.managedObjectIDForURIRepresentation(url), 
        let object = try? context.existingObjectWithID(oid) { 
    
        print(object) 
        // ... 
    } 
    
    :だから管理オブジェクトIDが単に

    NSUserDefaults.standardUserDefaults().setURL(object.objectID.URIRepresentation(), 
                  forKey: "selected") 
    

    とオブジェクトIDと、このような例のためのオブジェクトを取得するように行われている保存

  2. ...

選択した設定を保存する別の方法については、the above commentを参照してください。

+0

URL/NSDataをNSManagedObjectに戻すにはどうしたらいいですか? – Sweeper

+0

@ Paulw11は既に質問のコメントに質問に答えました – Wain

+0

ありがとうございました。私は実際に夕食から戻ってきました。だから私はとても遅く返事をした。 :) – Sweeper

関連する問題