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

How to share data using Watch Connectivity when working with Core Data

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

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

当 iOS 应用程序从 watchOS 接收到消息时,它应该将 Objects 的数组发送到 watchOS 扩展以显示数据WKInterfaceTable,但我不确定该怎么做。最终我想要实现的是;

观看 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"])
   }

您可以在 sendMessage 中使用 replyHandler 来执行此操作。确保在 Watch 和 iOS App 上都实现了回复处理程序以获取此信息。

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

此外,关于您的响应(发送对象数组)- 您应该将其作为字典发送并在手表上获取。

首先,这是一个非常好的问题。对于初学者,我建议您观看 WWDC 2015 中的 session:Session 713 - Introducing Watch Connectivity。这个可以查到here.

现在回答你的实际问题。有一个很棒的教程和 Github repo 向您展示了如何使用应用程序组在 Apple Watch 应用程序和容器应用程序之间传递 Core Data,因为这使您能够访问所有共享内容,例如 Core Data 甚至 NSUSerdefaults。

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

朱利安,希望有所帮助。

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

  • 如果用户adds/edits/deletes对象在手表OS数组中 我们如何更新 iPhone 上的数据?

    将 objectId 连同您的 sendMessage 方法中的新更改一起从 watch 发送到 phone,在 phone 上接收后,将更改保存在数据库中并发送更新的您的 replyHandler 中的值,以便您的手表内容会相应更新。

  • 此外,iOS 应用程序嵌入在 UITabBarController 中,因此 我与哪个视图控制器通信重要吗?

    您希望viewController 与您沟通,或者负责进行更改的人应该还活着。如果多个 ViewController 正在监听 WCSessionDelegates,那么当您从 watch 发送任何消息时,所有实时控制器都会收到该消息。您应该在 sendMessage 字典中包含某种 identifier,这样您就可以知道要执行哪个操作。就像如果你想 delete 一个对象然后当 watch 发送消息时 identifier 将包含 delete 以便在接收时你可以检查 identifier 值和执行delete操作。