gpt4 book ai didi

ios - 识别 iCloud coreData 更新 : good practice

转载 作者:行者123 更新时间:2023-11-29 02:42:54 25 4
gpt4 key购买 nike

我有使用 iCloud 和 CoreData(同一容器)的应用程序(iOS 和 Mac)。每个设备都可以创建或更新数据。当一个设备创建或更新一个被管理对象时,其他设备最终需要执行与该被管理对象相关的某个 Action (与 UI 无关)。

例如,

  • 设备 1 离线,
  • 设备 2 在线并更改托管对象。
  • 稍后,设备 1 在线:它必须识别创建和更新的托管对象以执行某些操作。

我的问题:我可以依靠通知系统来实现吗? (NSPersistentStoreCoordinatorStoresDidChangeNotificationNSPersistentStoreDidImportUbiquitousContentChangesNotification)

依赖通知意味着当数据发生变化时,我必须确定通知最终会到达我在每台设备上的应用程序。特别是,本地存储上的数据同步是否仅在应用程序运行时执行(因此希望确保如果应用程序注册足够快,通知将到达该应用程序)?

或者是否应该使用我自己的机制来实现这种类型的需求,以识别商店中的修改? (这会使模型复杂化,因为每个设备都必须知道它已经处理了对特定托管对象的更新)

编辑:看到这句话here :

Core Data imports changes persisted to iCloud from other peers after first-time setup and while your app is running.

这告诉我通知是可靠的。

最佳答案

根据我的经验,这些通知是可靠的。来自 iCloud 的更改只会在您的应用程序运行时同步。该同步也仅在您添加相应的持久存储后才会发生。 (即,您已在持久存储协调器上调用了 addPersistentStoreWithType)。

我总是在添加持久存储之前注册通知(代码如下所示)。这样您就可以确定您会收到相关通知。

// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}

NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

NSNotificationCenter* notificationCentre = [NSNotificationCenter defaultCenter];

[notificationCentre addObserver:self
selector:@selector(CoreData_StoresWillChange:)
name:NSPersistentStoreCoordinatorStoresWillChangeNotification
object:coordinator];
[notificationCentre addObserver:self
selector:@selector(CoreData_StoresDidChange:)
name:NSPersistentStoreCoordinatorStoresDidChangeNotification
object:coordinator];
[notificationCentre addObserver:self
selector:@selector(CoreData_StoreDidImportUbiquitousContentChanges:)
name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
object:coordinator];

NSMutableDictionary* workingOptions = [self.storeOptions mutableCopy];

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.storeURL options:workingOptions error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}

return _persistentStoreCoordinator;
}

关于ios - 识别 iCloud coreData 更新 : good practice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25538877/

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