Core data iCloud通知没有在我的iOS 7应用程序中触发

Core data iCloud通知没有在我的iOS 7应用程序中触发,core-data,ios7,icloud,nsnotificationcenter,Core Data,Ios7,Icloud,Nsnotificationcenter,我对核心数据和iCloud还不熟悉,但我已经设法让这两种技术都发挥作用(大部分)。我的数据正在iOS设备之间同步,但我不知道何时同步。:) 我正在尝试侦听iCloud何时可以进行更改,以便刷新UI 我在我的AppDelegate中设置了核心数据和iCloud,如下所示:大部分都是我应用的示例代码,但它似乎运行良好 在显示应用程序数据的单独视图控制器中,我将通知设置为: - (void)viewDidLoad { [super viewDidLoad]; //Register notif

我对核心数据和iCloud还不熟悉,但我已经设法让这两种技术都发挥作用(大部分)。我的数据正在iOS设备之间同步,但我不知道何时同步。:)

我正在尝试侦听iCloud何时可以进行更改,以便刷新UI

我在我的AppDelegate中设置了核心数据和iCloud,如下所示:大部分都是我应用的示例代码,但它似乎运行良好

在显示应用程序数据的单独视图控制器中,我将通知设置为:

- (void)viewDidLoad
{
  [super viewDidLoad];

  //Register notifications
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updatesAvailable) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:nil];
}

- (void)updatesAvailable{
  //This never fires...
  NSLog(@"Update available...");
  [PPStatusBar showSuccessWithStatus:@"Update available..."];
}
- (void)CoreData_StoreDidImportUbiquitousContentChanges:(NSNotification*) notification {
}
下面是我的问题:

  • 如果所有iCloud的东西都设置在我的AppDelegate中,这是否意味着它可以在任何地方使用?或者,我必须在每个要侦听通知的视图控制器中重新初始化我的持久存储协调器吗
  • 我计划用
    updatesAvailable
    方法重新查询我的实体,那么在调用
    NSPersistentStoreDidImportUbiquitousContentChangesNotification
    时,来自iCloud的数据是否一直进入核心数据对象图
  • 假设在10秒内,两个iOS设备之间会传播单个记录的小更改,这安全吗
  • 除了iOS7模拟器之外,我在两台iOS7设备之间也尝试过这个,但仍然没有成功。我还设法让iCloud key/value change监听器工作得很好,只是无法处理核心数据


    提前感谢您的帮助。:)

    问题似乎出在addObserver调用中。对象为nil,但它应该是您的持久存储协调器。例如:

    [notificationCentre addObserver:self
                           selector:@selector(CoreData_StoreDidImportUbiquitousContentChanges:)
                               name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
                             object:coordinator];
    
    然后调用如下结构的通知处理程序:

    - (void)viewDidLoad
    {
      [super viewDidLoad];
    
      //Register notifications
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updatesAvailable) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:nil];
    }
    
    - (void)updatesAvailable{
      //This never fires...
      NSLog(@"Update available...");
      [PPStatusBar showSuccessWithStatus:@"Update available..."];
    }
    
    - (void)CoreData_StoreDidImportUbiquitousContentChanges:(NSNotification*) notification {
    }
    
    要回答您的具体问题:

  • 持久存储、托管对象上下文等将在其他地方访问。但是,请注意,托管对象上下文不是线程安全的。您应该只从同一线程访问它
  • 新数据应在您收到通知时可访问。如果您只想了解新数据,也可以使用NSNotification对象本身。它包含所有已更改对象的详细信息,这些对象根据它们是创建、修改还是删除而分组
  • 传播时间似乎非常多变。模拟器允许您请求同步(Cmd+I),但我不知道实际设备上有类似的机制。但是,如果您当前正在调试其中一个正在运行的设备,您将能够在Xcode中看到与iCloud之间的活动
  • 另请注意。导入通知将在用户界面的不同线程中出现。如果要进行任何UI更改(例如刷新),则需要使用类似于以下内容的方法来确保它们在UI线程上运行:

    dispatch_async(dispatch_get_main_queue(), ^{
        // Refresh UI here
    });
    

    感谢您周到的回复。这很有帮助。将商店协调员添加到通知中会有所帮助,但我仍然有一些问题:(1)即使我等待30秒,iCloud同步似乎也不会发生。不过,触发iCloud同步会触发通知。(2) 一旦收到此通知,我的数据库就没有可用的更改(我重新查询核心数据,但它没有新记录)。(3) 重建应用程序时始终显示新数据。有什么想法吗?(1)长延时是在设备上还是仅在模拟器上?我发现在过去模拟器有时会停止同步。完全关闭并重新启动或重新启动计算机通常会有所帮助。(2)您可以尝试在导入更改通知结束时执行上下文保存。我的设置中间接地包含了这一点,这可能就是为什么我可以在导入通知结束时查询核心数据的原因。在仅设备测试中,延迟似乎较短,但不像我预期的那样接近即时。在通知方法内部重新查询时,我仍然无法从核心数据中获取最新数据。我是否应该获取通知返回的对象并将其保存到核心数据?我想这是自动发生的。试试这些样品,它们可能会对你有所帮助。您不能假定任何同步时间范围。。。在模拟器中,您需要使用调试触发器iCloud Sync使同步工作。谢谢,@DuncanGroenewald!我来看看。