gpt4 book ai didi

iOS:SharedCoreData 示例代码(iCloud + CoreData)|如何合并更改

转载 作者:可可西里 更新时间:2023-11-01 05:37:36 24 4
gpt4 key购买 nike

我正在尝试为 iCloud 和 CoreData ( link to github sample code ) 采用 WWDC 2012 示例代码,需要一些帮助来理解那里发生了什么。

我有一个 TableView ,它从 NSFetchedResultsController 中获取其内容,就像在示例中一样。 NSFetchedResultsController 与示例提供的 CoreDataController 中的主 NSManagedObjectContext 连接。对条目的更改从一台设备同步到另一台设备,它就像一个魅力。但是没有地方将来自 iCloud 的更改实际合并到主上下文中。我见过很多示例,其中 NSPersistentStoreDidImportUbiquitousContentChangesNotification 用于合并更改,但在此代码中从未发生过。

但奇怪的是:我从主上下文中取出一个对象并保存它。如果我收到 NSPersistentStoreDidImportUbiquitousContentChangesNotification,我使用 objectId 并从 NSMangedObjectContext 重新加载对象:

NSManagedObjectID* objectId = [myObject objectID];
NSManagedObject* theNewObject = [[_coreDataController mainThreadContext] objectWithID:objectId];
myObject = theNewObject;

但是对象不是最新的。即使我使用对象的唯一属性对谓词进行提取。但是带有 NSFetchedResultsController 的 TableView 显示了更改。我在这里缺少什么?

编辑 1(阅读汤姆的回答后):

我为 NSPersistentStoreDidImportUbiquitousContentChangesNotification 添加了一个观察者:

- (void)iCloudupdate:(NSNotification*)note {
NSManagedObjectContext* moc = [[CoreDataController sharedController] mainThreadContext];
[moc performBlock:^{
[moc mergeChangesFromContextDidSaveNotification:note];
[self refreshObject];
}];
}

refreshObject 方法使用 NSManagedObjectID 从主 MOC 中获取对象,但它仍然是旧版本。

最佳答案

这可能是一个 iOS 错误。请参阅此线程:http://devforums.apple.com/message/735512#735512

这为我解决了问题:

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.stalenessInterval = 0;

这没有帮助:

[moc refreshObject:myObject mergeChanges:YES];

关于iOS:SharedCoreData 示例代码(iCloud + CoreData)|如何合并更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13072287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com