2011-12-08 40 views
0

我正在使用名稱爲NSManagedObjectContextDidSaveNotification的通知,當它收到通知時,userInfo字典包含保存期間對上下文所做的所有更改。我怎樣才能將這些數據外推到我的託管對象模型中?我試過這樣做如何在Core Data中保存上下文時更改實體?

- (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的NSSet,而不是TaskInfo本身。

我不知道究竟你的「推斷這些數據轉化爲我的管理對象模型」的意思,但如果它的意思是「更新另一個NSManagedObjectContext讓那些剛保存的變化出現在它」,還有一個更簡單的方法:

請看手冊中的mergeChangesFromContextDidSaveNotification:。它需要由上下文A觸發的NSManagedObjectContextDidSaveNotification,並將所有更改都保存到上下文B中。不需要在通知的userInfo周圍進行戳動。

+0

我總是添加一個對象,所以我希望能夠直接訪問正在添加的實體。有沒有合理的方法來做到這一點?一旦該實體處於上下文B中(假設它來自A),那麼我將不得不搜索上下文並獲取該對象,對吧?但我已經知道這個任務是什麼,所以我只想直接訪問它。 – gurooj

+0

在這種情況下,在執行mergeChangesFromContextDidSaveNotification之後,爲objectID(s)通知用戶信息,並通過ID向對象請求上下文對象可能是合理的。這樣你可以將對象與正確的上下文相關聯。從原來的問題中得出的結論是,即使只有一個,通知用戶信息始終包含一組對象。 – rgeorge

+0

好的,謝謝。我會嘗試。我將如何去提取該ID?我爲objective-c做了很少的字符串工作。如果你知道一個好的網站,那會更好。感謝你目前的幫助。 – gurooj

0

因此,我最終通過在AddViewController委託中保存之前找到任務的objectID並將其傳遞給通知中使用的主表視圖來找到解決方案。比試圖分析NSManagedObjectContextDidSaveNotification的userInfo字典中的更新日誌要容易得多。

相關問題