Ios 使用核心数据时如何使用Watch Connectivity共享数据

Ios 使用核心数据时如何使用Watch Connectivity共享数据,ios,swift,core-data,watchkit,watchconnectivity,Ios,Swift,Core Data,Watchkit,Watchconnectivity,在我的iOS应用程序中,我使用核心数据存储数据,并使用提取请求创建一个NSManagedObjects数组,以显示在UITableView中 在Watch OS上,我检查是否支持WCSession并激活会话,然后从Watch OS扩展向iOS应用程序发送消息 当iOS应用程序从watchOS接收到消息时,它应该将对象数组发送到watchOS扩展,以在WKInterfaceTable中显示数据,但我不确定如何执行此操作。最终,我想要实现的是 如何与watchOS扩展共享对象数组 如果用户在手表上

在我的iOS应用程序中,我使用核心数据存储数据,并使用提取请求创建一个
NSManagedObject
s数组,以显示在
UITableView

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

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

  • 如何与watchOS扩展共享
    对象数组

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

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

在接口控制器中查看操作系统收藏夹

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)
    }
}
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"])
   }
IOS应用程序:收藏夹ViewController

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)
    }
}
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应用程序上都实现了回复处理程序,以获得此结果

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


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

首先,这是一个非常好的问题。对于初学者,我建议您观看WWDC 2015:第713次会议-介绍手表连接的本次会议。这是可以找到的

现在谈谈你的实际问题。这里有一个很棒的教程,向您展示了如何使用应用程序组在Apple Watch应用程序和容器应用程序之间通信核心数据,因为这使您能够访问所有共享内容,例如核心数据甚至默认值

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

希望能有帮助,朱利安。

  • 如何与Watch OS扩展共享对象数组? 由于您使用的是
    WatchConnectivity
    framework,因此请使用
    sendMessage
    方法从iPhone发送对象数组,并在
    favoriteinterfacecontroller
    中执行
    func会话(session:WCSession,didReceiveMessage
    方法以获取响应,或者您可以在replyhandler中获取数组

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

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

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

    您希望与之通信的或负责进行更改的viewController应处于活动状态。如果多个viewController正在侦听
    wcSessionLegates
    ,则当您从watch发送任何消息时,所有活动控制器都将接收该消息。您应包括某种
    标识r
    在您的
    发送消息
    字典中,这样您就可以知道要执行的操作。例如,如果您想
    删除对象,那么当
    监视
    发送消息时,
    标识符
    将包含
    删除
    ,以便在接收时可以检查
    标识符
    值并执行
    删除te
    操作


我很确定github示例在Xcode 7或更确切地说,WatchSDK 2上不能很好地工作。似乎我必须同时打开iOS应用程序和Watch应用程序才能使用此方法。这样就无法在不拔出手机的情况下快速访问手表上的数据。我说得对吗?如果您在WCSession.h表示如果对方应用程序未运行,则对方应用程序将在收到消息后启动(仅限iOS对方应用程序)。消息字典只能接受属性列表类型。因此,即使您的counter iOS应用程序已关闭,并且您从watch向iPhone发送消息,它也会启动该应用程序并接收消息,但反向操作是不可能的。