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

时间:2015-12-18 22:51:56

标签: ios swift core-data watchkit watchconnectivity

在我的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"])
   }

3 个答案:

答案 0 :(得分:5)

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

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

    使用sendMessage方法将watchId与手表中的新更改一起发送,在手机上接收后,数据库中的更改将保存并在 replyHandler 这样您的观看内容将相应更新。

  • iOS应用程序也嵌入在UITabBarController中 与我沟通的视图控制器有什么关系?

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

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

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

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

希望有帮助,朱利安。