Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iPhone和Apple Watch应用程序之间核心数据SQLite存储更改通知_Ios_Core Data_Watchkit_Apple Watch - Fatal编程技术网

Ios iPhone和Apple Watch应用程序之间核心数据SQLite存储更改通知

Ios iPhone和Apple Watch应用程序之间核心数据SQLite存储更改通知,ios,core-data,watchkit,apple-watch,Ios,Core Data,Watchkit,Apple Watch,我有一个iPhone(iOS 8)和Apple Watch(watchOS 1)应用程序,它们使用核心数据(SQLite商店,位于共享应用程序组中)共享数据。这两个应用程序都使用放置在共享框架中的相同数据访问代码NSPersistentStoreCoordinator正在以以下方式设置: lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = { let sharedContainerURL = NSFile

我有一个iPhone(iOS 8)和Apple Watch(watchOS 1)应用程序,它们使用核心数据(SQLite商店,位于共享应用程序组中)共享数据。这两个应用程序都使用放置在共享框架中的相同数据访问代码<代码>NSPersistentStoreCoordinator正在以以下方式设置:

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    let sharedContainerURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(self.sharedAppGroup)!
    let storeURL = sharedContainerURL.URLByAppendingPathComponent(self.databaseName)
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)

    var error: NSError? = nil
    if coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error) == nil {
        fatalError("Unable to add persistent store: \(error)")
    }

    return coordinator
}()
据我所知,在运行时,每个应用程序都有自己的
nsPersistentStoreCoordinator
实例(正如iPhone应用程序和WatchKit扩展程序有完全独立的地址空间),但这两个应用程序连接到完全相同的SQLite数据库文件


当Watch应用程序更改公共SQLite存储中的某些数据时,如何通知iPhone应用程序?反之亦然:当iPhone应用程序更改公共持久存储中的某些数据时,如何通知Watch应用程序?

不容易。无法在两个应用程序之间发送直接通信

在这方面,我目前的建议是使用磁盘上的文件,这些文件包括从一个应用程序到另一个应用程序的任何更改的objectid

当您检测到保存到磁盘时,您会编写一个文件,例如JSON文件,其中最多包含三个数组:update、insert、delete。文件名应该是某种形式的时间戳

另外,你应该观察其他应用程序创建的任何文件的目录,并使用它们。加载ObjectID,然后从ala iCloud或在iOS 9中创建远程通知。然后在处理后删除该文件

启动时,从其他存储中删除所有文件,因为您将自动了解启动前发生的任何事情


不简单,但相当直接。

我发现非常令人满意的解决方案是使用库

它通过使用CFNotificationCenter Darwin通知和在共享应用程序组中写入/读取数据文件来工作,从而在iOS应用程序和应用程序扩展(Watch应用程序、今天的小部件等)之间实现即时通信

基本代码如下所示:

  • 虫洞初始化

    wormhole = MMWormhole(applicationGroupIdentifier: appGroup, optionalDirectory: nil)
    
  • 将数据对象传递到虫洞

    let payload = ["Key": "Value"]
    wormhole.passMessageObject(payload, identifier: theSameMessageIdentifier)
    
    wormhole.listenForMessageWithIdentifier(theSameMessageIdentifier) { message -> Void in
    
        if let payloadDictionary = message as? Dictionary<String, String> {
            // Do some work
        } 
    }
    
  • 侦听来自虫洞的传入对象

    let payload = ["Key": "Value"]
    wormhole.passMessageObject(payload, identifier: theSameMessageIdentifier)
    
    wormhole.listenForMessageWithIdentifier(theSameMessageIdentifier) { message -> Void in
    
        if let payloadDictionary = message as? Dictionary<String, String> {
            // Do some work
        } 
    }
    
    wormhole.listenForMessageWithIdentifier(SameMessageIdentifier){message->Void in
    如果让payloadDictionary=消息作为字典{
    //做些工作
    } 
    }
    

就这么简单。

这个图书馆可能实现了马库斯·s·扎拉在回答中提到的想法。