我不確定這是一個完整的答案,但我正在研究一個類似的情況。我所採用的實現路徑是使用子對象(遍佈整個地方) - 或者根據需要更像臨時子上下文。
然而,我應該提到的第一件事是確保使用CoreData調試功能構建到XCOde中。我做了第二次運行計劃有
-com.apple.CoreData.ConcurrencyDebug 1
![enter image description here](https://i.stack.imgur.com/iCC8A.png)
在應用程序初始化我有我的正常NSManagedObjectContext
- 這是各地傳遞給我的後臺網絡線程。
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:parentObjectContext];
然後,每當我需要從父傳的東西孩子,我最終會做:
[child objectWithID:(object-in-parent-context)]
或者我最終會做
__block AHRS_RPYL * ret;
[[self getChildContext] performBlockAndWait:^{
ret = [NSEntityDescription insertNewObjectForEntityForName:@"RPYL" inManagedObjectContext:[self getChildContext]];
// ... lots of code
}];
我不能說我真的「愛「這種方法,而且我暫時堅持它,但它似乎工作得很好。
我的大部分視圖控制器之間我有一個
@synthesize managedObjectContext;
在我prepareForSegue
方法
// Pass on managedObjectContext
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// dispatch_async(dispatch_get_main_queue(), ^{
// If the destination VC is able to take teh setManagedObjectContext method the current objectContext will be passed along.
if ([segue.destinationViewController respondsToSelector:@selector(setManagedObjectContext:)]) {
[segue.destinationViewController performSelector:@selector(setManagedObjectContext:)
withObject:self.managedObjectContext];
} else {
NSLog(@"Segue to controller [%@] that does not support passing managedObjectContext", [segue destinationViewController]);
}
// });
}
摘要
- 我和你的第二個選擇的選項,它的工作雖然在我誠實的意見中感覺有點笨拙,但是可以做到。事實是,我們正在考慮切換到Realm而不是
CoreData
,因爲無論您如何看待它,CoreData
都不是最易於使用的選項。
UDPATES
節省代碼
其實我救孩子上下文每50個消息,並於母公司每250它看起來像(沒有觸及在這個年齡段代碼)。我不能保證這是做最好的正確方法,但它確實有效,並且確保光盤訪問最小化。我收到了很多消息,比如20+秒,所以我想要做這個堆棧類型。你可能不在乎
(self.getChild())返回子上下文 - 它的舊代碼我離開這裏。
if (msgCount % 50 == 0) {
// Child Save!
// NSLog(@"Saving SDatas");
__block NSManagedObjectContext *currentChild = [self getChildContext];
[self incChildContext];
// Parent-Child save methodology
[currentChild performBlock:^{
NSError *error;
if (![currentChild save:&error]) {
NSLog(@"\n error => %@ \n", [error localizedDescription]);
NSLog(@" error => %@ ", [error userInfo]);
[NSException raise:@"Database Write Error" format:@"%@ %@", [error localizedDescription], [error userInfo]];
// abort();
}
if (msgCount % 250 < 5) {
[parentObjectContext performBlock:^{
NSError *error;
if (![parentObjectContext save:&error]) {
NSLog(@"\n error => %@ \n", [error localizedDescription]);
NSLog(@" error => %@ ", [error userInfo]);
[NSException raise:@"Database Write Error" format:@"%@ %@", [error localizedDescription], [error userInfo]];
// abort();
}
}];
}
[currentChild reset];
}];
}
刪除
[childContext performBlock:^{
// LOTS OF CODE
// to build a query set of the records we want to kill
// End lots of code
[childContext deleteObject:msg];
if (i % modFactor == 0) {
self.percentDone = i/totalRecords;
NSLog(@"%.1f Saving ...", self.percentDone * 100);
NSError *error;
if (![childContext save:&error]) {
NSLog(@"\n error => %@ \n", [error localizedDescription]);
NSLog(@" error => %@ ", [error userInfo]);
[NSException raise:@"Database Write Error" format:@"%@ %@", [error localizedDescription], [error userInfo]];
// abort();
}
[parentContext performBlock:^{
NSError *errrror;
if (![parentContext save:&errrror]) {
NSLog(@"\n error => %@ \n", [error localizedDescription]);
NSLog(@" error => %@ ", [error userInfo]);
[NSException raise:@"Database Write Error" format:@"%@ %@", [error localizedDescription], [error userInfo]];
// abort();
}
}];
}
}];
...
再次 - 就像我之前說這可能不是做事情的最好方法,但我有一個父/子堆棧和它工作。這是我編寫的第一批iOS應用程序之一,爲了再次完成它,我打了核心數據並使用其他內容。
我們有一個非常高的更新率,所以當我們使用一個單一的堆棧時,它使得用戶界面非常緩慢。遷移到父母/孩子的速度很慢 - 我再次這樣做,我認爲它會變得更順暢,因爲我會寫很多幫助函數來處理這些問題(或者只是使用swift)。
祝你好運。
您的對象是否有任何ID屬性? – kirander
@kirander是的,他們有 – AppsDev
在父上下文中使用私有上下文。通過從服務器響應中獲取的ID從存儲中獲取所需的對象。根據情況更新,刪除或創建新的。 – kirander