2011-12-08 18 views
0

NSManagedObjectContextDidSaveNotificationという名前の通知を使用しています。通知を受け取ったとき、userInfoディクショナリには、保存中にコンテキストに加えられたすべての変更が含まれています。そのデータを管理オブジェクトモデルに外挿する方法はありますか?私はこれをやってみたコンテキストがコアデータに保存されたときに、エンティティを変更する方法を教えてください。

- (void)addControllerContextDidSave:(NSNotification*)saveNotification { 

    NSMutableDictionary *userInfo = (NSMutableDictionary *)[saveNotification userInfo]; 
    NSLog(@"userInfo is %@", userInfo); 
    TaskInfo *taskInfo = (TaskInfo *)[userInfo objectForKey:@"inserted"]; 
    NSLog(@"taskInfo is %@", taskInfo); 
} 

ここでTaskInfoは私のカスタム管理オブジェクトモデルです。そしてそれはこれを印刷しました

userInfo is { 
     inserted = "{(\n <TaskInfo: 0x15f350> (entity: TaskInfo; id: 0x13fda0 <x-  coredata://1F98E14E-259F-4CB3-84E2-9AC8466CCD1B/TaskInfo/p2> ; data: {\n completionDate = nil;\n creationDate = \"2011-12-08 02:14:04 +0000\";\n duration = 10860;\n elapsedTime = 0;\n isCompleted = 0;\n isRepeating = 0;\n isRunning = 0;\n isToday = 0;\n projectedEndTime = nil;\n specifics = nil;\n startTime = nil;\n timesReminded = 0;\n title = haha;\n})\n)}"; 
     updated = "{(\n)}"; 
    } 
    2011-12-07 20:14:54.147 Tisk Task 3[3161:707] taskInfo is {(
     <TaskInfo: 0x15f350> (entity: TaskInfo; id: 0x13fda0 <x-coredata://1F98E14E-259F- 4CB3-84E2-9AC8466CCD1B/TaskInfo/p2> ; data: { 
     completionDate = nil; 
     creationDate = "2011-12-08 02:14:04 +0000"; 
     duration = 10860; 
     elapsedTime = 0; 
     isCompleted = 0; 
     isRepeating = 0; 
     isRunning = 0; 
     isToday = 0; 
     projectedEndTime = nil; 
     specifics = nil; 
     startTime = nil; 
     timesReminded = 0; 
     title = haha; 
    }) 
    )} 

私はTaskInfoモデルの外に{()}の余分なセットがあると思います。誰でも何か提案がありますか?

答えて

1

外側{()}は、[userInfo objectForKey:@"inserted"]が実際にはTaskInfo自体ではなく単一のTaskInfoを含むNSSetを返していることを伝えています。

は、私は正確にあなたが「私の管理オブジェクトモデルにそのデータを外挿する」によって何を意味するかわからないんだけど、それが意味している場合、より簡単な方法があります「これらのたて保存された変更は、その中に表示されるように、別のNSManagedObjectContextを更新」:

mergeChangesFromContextDidSaveNotification:をマニュアルでご覧ください。コンテキストAによって起動されるのはNSManagedObjectContextDidSaveNotificationであり、すべての変更がコンテキストBに保存されます。通知のuserInfoを必要としないでください。

+0

私は常に1つのオブジェクトを追加していますので、現時点で追加されるエンティティに直接アクセスできることを期待していました。これを行う合理的な方法はありますか?そのエンティティがコンテキストB(Aから来たものと仮定して)に入ると、コンテキストを検索してオブジェクトをフェッチする必要があります。しかし、私はすでにタスクが何であるか知っているので、私はそれに直接アクセスしたいだけです。 – gurooj

+0

その場合、mergeChangesFromContextDidSaveNotificationを実行した後で、objectIDの通知userinfoをスクロールし、IDでオブジェクトのコンテキストを尋ねるのが妥当かもしれません。そうすれば、正しいコンテキストに関連付けられたオブジェクトを取得できます。あなたの元の質問からの撤去は、たとえ唯一のものであっても通知のuserinfoは常にオブジェクトのセットを含んでいるということです。 – rgeorge

+0

よろしくお願い致します。私はそれを試みます。そのIDをどのように抽出するのですか?私は客観的な目的のために文字列作業をほとんどやっていません。あなたが良いウェブサイトを知っていれば、それはさらに良いでしょう。これまでの助けてくれてありがとう。 – gurooj

0

私は自分の問題の解決策を見つけることができました。それは、タスクのobjectIDをAddViewControllerデリゲートに保存する直前に見つけて、それを通知で使用していたメインテーブルビューに渡すことでした。 NSManagedObjectContextDidSaveNotificationというuserInfoディクショナリのchangelogを解析しようとするよりもずっと簡単です。

関連する問題