使用Core Data时如何使用Watch Connectivity共享数据

在我的iOS应用程序中,我使用Core Data来存储数据和一个获取请求来创建一个NSManagedObject数组,以便在UITableView显示。

在Watch OS上,我检查是否支持WCSession并激活会话,然后从iOS应用程序向watchOS扩展发送消息。

当iOS应用程序从watchOS收到消息时,它应该将Objects数组发送到watchOS扩展,以在WKInterfaceTable显示数据,但我不确定如何执行此操作。 最终我想要实现的是;

  • 如何与watchOS扩展共享Objects数组?

  • 如果用户在Watch上的数组中添加/编辑/删除对象,我们如何更新iPhone上的数据?

  • 此外,iOS应用程序嵌入在UITabBarController因此与哪个视图控制器进行通信是否重要?

观看OS FavouritesInterfaceController

 var session : WCSession! override func willActivate() { // This method is called when watch view controller is about to be visible to user super.willActivate() //Check if session is supported and Activate if (WCSession.isSupported()) { session = WCSession.defaultSession() session.delegate = self session.activateSession() } } override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) // Interface Objects //Send Message sendmessagetoiphone() } func sendMessageToIphone() { if(WCSession.isSupported()){ session.sendMessage(["b":"goodBye"], replyHandler: nil, errorHandler: nil) } } 

IOS应用程序:FavouritesViewController

 var objects = [Objects]() func loadData() { let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext let request = NSFetchRequest(entityName: "Objects") request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)] do { try self.objects = moc.executeFetchRequest(request) as! [Objects] // success ... } catch { // failure print("Fetch failed") } } func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { //handle received message let value = message["Value"] as? String dispatch_async(dispatch_get_main_queue()) { self.messageLabel.text = value } //send a reply replyHandler(["Value":"Hello Watch"]) } 

  • 如何与Watch OS扩展共享对象数组? 由于您使用的是WatchConnectivity框架,因此使用sendMessage方法从iPhone发送对象数组,并在您的FavoritesInterfaceController实现func session(session: WCSession, didReceiveMessage方法以获取响应,或者您可以在replyhandler中获取数组)。

  • 如果用户在Watch OS上添加/编辑/删除数组中的对象,我们如何更新iPhone上的数据?

    发送objectId沿着sendMessage方法中的新更改从手表到手机,在手机上接收后,数据库中的更改将保存并在replyHandler中发送更新的值,以便相应地更新手表内容。

  • iOS应用程序也嵌入在UITabBarController中,因此与哪个视图控制器进行通信是否重要?

    您希望与之通信的viewController或负责进行更改的那个应该处于活动状态。 如果多个ViewControllers正在侦听WCSessionDelegates那么当您从watch发送任何消息时,所有实时控制器都将收到该消息。 您应该在sendMessage字典中包含某种identifier ,以便了解要执行的操作。 就像你想要delete一个对象一样,当watch发送一条消息时, identifier将包含delete这样在接收时你可以检查identifier值并执行delete操作。

您可以使用sendMessage中replyHandler来执行此操作。 确保在Watch和iOS App上实现回复处理程序以实现此目的。

基本上,如果你做对了,你的回复处理程序可以确保你的iOS应用程序响应手表应用程序的消息。

另外,谈到您的响应(发送一组对象) – 您应该将其作为字典发送并在手表上获取。

首先,这是一个非常好的问题。 对于初学者,我建议您从WWDC 2015观看此会话:会话713 – 介绍Watch Connectivity。 这可以在这里找到。

现在问你的实际问题。 有一个很棒的教程和Github回购 ,向您展示如何使用App Groups在Apple Watch应用程序和容器应用程序之间进行核心数据通信,因为这使您可以访问所有共享内容,例如Core Data甚至NSUSerdefaults。

然后,您可以在以下链接中找到有关如何执行此操作的完整教程。

希望有所帮助,朱利安。