NSFetchedResultsController 进行外部更改?

问题描述 投票:0回答:4

我正在 WatchKit 扩展中读取 CoreData 数据库,并从父 iPhone 应用程序更改存储。我想使用 NSFetchedResultsController 来驱动对手表 UI 的更改,但扩展中的 NSFetchedResultsController 不会响应对父应用程序中的存储所做的更改。有没有办法让辅助进程响应第一个进程中所做的更改?

core-data watchkit
4个回答
0
投票

一些需要尝试/考虑的事情:

您是否启用了应用程序组? 如果是这样,您的数据存储是否位于主机应用程序和扩展程序之间共享的位置? 如果是这样,删除缓存数据(如此处所述)有帮助吗?


0
投票

阅读非常相似问题的答案:https://stackoverflow.com/a/29566287/1757229

另请确保将

stalenessInterval
设置为 0。


0
投票

我也遇到了同样的问题。如果您想在主应用程序更新时更新手表应用程序,我的解决方案适用,但它可以轻松扩展为双向。

请注意,我在 NSNotificationCenter 上使用了一个简单的扩展,以便能够更轻松地发布和观察 Darwin 通知。

1.发布达尔文通知

在我的 CoreData 存储管理器中,每当我保存主托管对象上下文时,我都会发布一条 Darwin 通知:

notificationCenter.addObserverForName(NSManagedObjectContextDidSaveNotification, object: self.managedObjectContext, queue: NSOperationQueue.mainQueue(), usingBlock: { [weak s = self] notification in

    if let moc = notification.object as? NSManagedObjectContext where moc == s?.managedObjectContext {
        notificationCenter.postDarwinNotificationWithName(IPCNotifications.DidUpdateStoreNotification)
    }

})

2.收听达尔文通知(但仅限在手表上)

我在同一个班级中收听相同的达尔文通知,但确保我在实际的手表扩展上(以避免刷新刚刚更新的上下文)。我没有使用框架(也必须针对 iOS 7),因此我只是在主应用程序和手表扩展上添加了相同的 CoreDataManager。为了确定我在哪里,我使用编译时标志。

#if WATCHAPP
    notificationCenter.addObserverForDarwinNotification(self, selector: "resetContext", name: IPCNotifications.DidUpdateStoreNotification)
#endif

3.重置上下文

当手表扩展收到通知时,它会重置 MOC 上下文,并发送内部通知以告诉 FRC 进行自我更新。我不知道为什么,但如果不使用一点延迟,它就无法正常工作(欢迎提出建议

func resetContext() {
    self.managedObjectContext?.reset()

    delay(1) {
        NSNotificationCenter.defaultCenter().postNotificationName(Notifications.ForceDataReload, object: self.managedObjectContext?.persistentStoreCoordinator)
    }
}

4.最后,更新FRC

就我而言,我在数据结构中嵌入了一个普通的 FRC,因此我在 FRC 范围之外添加了观察者。无论如何,您可以轻松地继承 NSFetchedResultsController 并在其 init 方法中添加以下行(记住停止观察 dealloc)

NSNotificationCenter.defaultCenter().addObserver(fetchedResultController, selector: "forceDataReload:", name: CoreDataStore.Notifications.ForceDataReload, object: fetchedResultController.managedObjectContext.persistentStoreCoordinator)

extension NSFetchedResultsController {
    func forceDataReload(notification: NSNotification) {
        var error : NSError?
        if !self.performFetch(&error) {
            Log.error("Error performing fetch update after forced data reload request: \(error)")
        }

        if let delegate = self.delegate {
            self.delegate?.controllerDidChangeContent?(self)
    }
}

0
投票

您可以通过 NSPersistentHistory 使用持久历史记录跟踪。

© www.soinside.com 2019 - 2024. All rights reserved.