我的 iOS 7 应用程序中没有任何 iCloud 通知触发

Posted

技术标签:

【中文标题】我的 iOS 7 应用程序中没有任何 iCloud 通知触发【英文标题】:None of the iCloud Notifications Are Firing in my iOS 7 App 【发布时间】:2014-09-10 04:07:28 【问题描述】:

我是 Core Data 和 iCloud 的新手,但我已经设法让两者都正常工作(大部分情况下)。我的数据正在 ios 设备之间同步,但我不知道什么时候。 :)

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

我在我的应用程序委托中设置了 Core Data 和 iCloud,如下所示:http://d.pr/n/SxmZ 其中大部分是我应用的示例代码,但它似乎运行良好。

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

- (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..."];

所以这是我的问题:

    如果在我的应用程序委托中设置了所有 iCloud 内容,这是否意味着它可以在任何地方使用?或者我是否必须在我想要监听通知的每个视图控制器中重新初始化我的持久存储协调器? 我打算在 updatesAvailable 方法中重新查询我的实体,那么在调用 NSPersistentStoreDidImportUbiquitousContentChangesNotification 时,来自 iCloud 的数据是否已全部进入核心数据对象图? 假设小的单记录更改应该在 10 秒内在两台 iOS 设备之间传播是否安全?

我已经在两个 iOS 7 设备之间尝试过这个,除了 iOS 7 模拟器,但仍然没有运气。我还设法让 iCloud 键/值更改侦听器工作得很好,它只是不适用于 Core Data。

提前感谢您的帮助。 :)

【问题讨论】:

试试这些示例,它们可能对您有所帮助。您不能假设任何同步时间范围...在模拟器中,您将需要使用 Debug-Trigger iCloud Sync 才能使同步工作。 ossh.com.au/design-and-technology/software-development/… 谢谢@DuncanGroenewald!我会看看那些。 【参考方案1】:

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

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

然后调用结构如下的通知处理程序:

- (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) 一旦收到此通知,我的数据库就没有可用的更改(我重新查询 Core Data 并且它没有新记录)。 (3) 重建应用程序总是显示新数据。有什么想法吗? (1) 长时间延迟是在设备上还是在模拟器上?我过去发现模拟器有时会停止同步。完全关闭它并重新启动或重新启动计算机通常会有所帮助。 (2) 您可以尝试在导入更改通知结束时保存上下文。我在我的设置中间接拥有它,这可能就是我可以在导入通知结束时查询核心数据的原因。 看起来延迟在仅设备测试中更短,但它不像我预期的那样接近即时。 当我在通知方法中重新查询时,我仍然没有从 Core Data 中获取最新数据。我是否应该获取通知返回的对象并将它们保存到核心数据?我认为这是自动发生的。

以上是关于我的 iOS 7 应用程序中没有任何 iCloud 通知触发的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 iCloud 和(启用/禁用)Core Data - 永无止境的故事

iOS 7 的核心数据、iCloud 和预建数据

如何将现有核心数据 iOS 7 应用程序的数据迁移到 iCloud?

iCloud Core Data iOS 6 到 iOS 7 最初是空的本地后备存储

是否需要为 iCloud Drive 更新 iOS 7 iCloud 应用程序?

iOS 8 - 禁用 iCloud 照片共享活动