Core data 在Watch Extension和iPhone上使用相同的支持iCloud的CoreData存储

Core data 在Watch Extension和iPhone上使用相同的支持iCloud的CoreData存储,core-data,icloud,watchkit,Core Data,Icloud,Watchkit,从Apple Watch Extension打开支持iCloud的CoreData存储时,我看到了一些奇怪的行为。 我在所有目标上使用相同的iCloud容器 下面的图片显示了ubiquity容器内部的文件夹ubiquity容器结构: 看起来它为iPhone和Watch创建了不同的商店 我在iPhone应用程序和手表扩展之间共享相同的CoreData堆栈。知道为什么会这样吗? 如果我理解正确,它会将iPhone应用程序和手表扩展作为一个单独的用户来对待吗 如果有人能提供建议,我将不胜感激。您应该使

从Apple Watch Extension打开支持iCloud的CoreData存储时,我看到了一些奇怪的行为。 我在所有目标上使用相同的iCloud容器

下面的图片显示了ubiquity容器内部的文件夹ubiquity容器结构:

看起来它为iPhone和Watch创建了不同的商店

我在iPhone应用程序和手表扩展之间共享相同的CoreData堆栈。知道为什么会这样吗? 如果我理解正确,它会将iPhone应用程序和手表扩展作为一个单独的用户来对待吗


如果有人能提供建议,我将不胜感激。

您应该使用应用程序组在Watch和iPhone之间共享相同的核心数据存储。为这两个目标启用应用程序组,在您的配置文件中进行配置,然后获取您的持久存储URL,如下所示:

NSURL *storeURL = [[NSFileManager defaultManager] 
     containerURLForSecurityApplicationGroupIdentifier:appGroupIdentifier];
手表将通过同样为应用程序组启用的WatchKit扩展访问核心数据存储。如图4.1所示,参见苹果的


考虑让您的WatchKit扩展使用openParentApplication与父应用程序通信。使用openParentApplication易于实现,有助于保持WatchKit扩展中的代码简单快速

从WatchKit扩展接口控制器,调用openParentApplication

NSDictionary *requst = @{@"request":@"myRequest"};

    [InterfaceController openParentApplication:requst reply:^(NSDictionary *replyInfo, NSError *error) {

            if (error) {
                NSLog(@"%@", error);
            } else {
                // DO STUFF
            }
        }];
然后,使用

 - (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply{

还可以考虑在主应用程序中使用JSON数据NSJSONSerialization来响应watch扩展

我用它来安装非iCloud。或者你是说我也需要在共享组中使用ubiquity容器,但我认为这是不可能的…我的问题是,NSPersistentStoreCoordinator.addPersistentStoreWithType在同一ubiquity容器中打开不同的存储请参见上面的屏幕截图-手机和手表的不同GUID,它的行为就像它的不同iCloud用户一样我相信我猜你必须将数据从手表传递到应用程序,然后将其存储在核心数据中,而不是让手表直接访问它。每次使用这种方法初始化核心数据堆栈和获取记录可能会很耗时。此外,我还将失去监视无处不在的更新的能力。可能在watch上以只读模式打开存储,而不是使用openParentApp进行编辑可能是一个解决方案,但我仍然需要每次初始化核心数据堆栈。我想知道是否会将单例实例保留在内存中。需要试一试吗