【问题标题】:Real time sync of Core Data between WatchKit and the appWatchKit 和 App 之间的 Core Data 实时同步
【发布时间】:2015-03-25 20:30:24
【问题描述】:

我正在为 iPhone 应用程序编写 WatchKit 扩展。我使用 App Groups 共享核心数据。这是有效的,数据是共享的。现在,如果应用程序在前台运行并且新的数据库条目从手表添加到数据库,我想刷新 iPhone 应用程序内的数据。跟踪我订阅了NSManagedObjectContextDidSaveNotification

[[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(mergeChanges:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:nil];
        }
    }

合并方法:

- (void)mergeChanges:(NSNotification *)notification {
    if(notification.object != self.managedObjectContext) {
        [self performSelectorOnMainThread:@selector(updateMainContext:) withObject:notification waitUntilDone:NO];
    }
}

更新主上下文方法:

- (void)updateMainContext:(NSNotification *)notification {
    assert([NSThread isMainThread]);
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}

我试图在模拟器上测试它(通过同时运行 iPhone 和 Watch 模拟器),但不幸的是 NSManagedObjectContextDidSaveNotification 没有被调用。

真的可以在模拟器上测试吗?如果是,这是正确的方法吗?

【问题讨论】:

    标签: ios objective-c core-data nsmanagedobjectcontext watchkit


    【解决方案1】:

    您不能使用 NSNotificationCenter,因为 iOS 应用程序和扩展程序是不同的进程。查看使用 MMWormhole 在进程之间发布您自己的通知。您可以在您的扩展程序和 iOS 应用程序中收听NSManagedObjectContextDidSaveNotification,然后使用 MMWormhole 让其他进程知道该通知。此外,您需要手动刷新托管数据对象(请参阅[NSManagedObjectContext refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag])。

    【讨论】:

    • 感谢您的帮助。我的印象是,如果应用程序和手表使用相同的 NSPersistentStore(sqlite 文件),那么我将能够跟踪其中的更改。我错了吗?我认为这类似于在不同线程上处理多个上下文。
    • 因为 WatchKit 扩展程序和 iOS 应用程序运行在不同的进程中,所以它们不会相互通信。当您有两个线程在同一个进程中运行时,它们可以相互通信。所以你必须管理沟通。我将它添加到我的 WatchKit 扩展中,它不需要太多额外的工作。
    • 实际上我很确定这应该有效。您可以使用通知中心来收听 WatchKit 扩展中的内容,而他正在尝试收听的是从 WatchKit 应用程序中设置的 NSManagedObjectContext,该应用程序附加到使用应用程序组在应用程序之间共享的持久存储.或者我在这里错过了什么?我的 watchkit 应用使用 NSFetchedResultsController 监听共享数据库更改。
    • 我以为他试图在他的 WatchKit 扩展中监听对 iOS 应用程序中持久性存储所做的更改。是的,您可以让您的扩展程序监听扩展程序中所做的更改。
    • 嗯,但我想我的意思是这样的:假设您有一个在电话和分机之间共享的持久存储,并且您的分机上设置了一个 CoreData 堆栈,该堆栈连接到该堆栈持久存储。现在你的 iPhone 对这个存储进行了更改,你的手表扩展上的 CoreData 堆栈应该对它们做出反应,对吧?
    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2011-12-14
    • 2014-08-31
    • 2013-02-02
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多