Как обмениваться данными с помощью Watch Connectivity при работе с Core Data

В моем приложении iOS я использую Core Data для хранения данных и запроса выборки для создания массива NSManagedObject для отображения в UITableView.

В ОС Watch я проверяю, поддерживается ли WCSession и активен сеанс, а затем отправьте приложение iOS из расширения watchOS.

Когда приложение iOS получает сообщение от watchOS, оно должно отправить массив Objects на расширение watchOS, чтобы отобразить данные в WKInterfaceTable, но я не уверен, как это сделать. В конечном итоге я пытаюсь достичь:

  • Как передать массив Objects с расширением watchOS?

  • Если пользователь добавляет/редактирует/удаляет объекты в массиве 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"])
   }

Ответ 1

  • Как поделиться массивом объектов с расширением Watch OS? Поскольку вы используете инфраструктуру WatchConnectivity, отправьте массив объектов из iPhone с помощью метода sendMessage и в FavoritesInterfaceController реализуйте метод func session(session: WCSession, didReceiveMessage, чтобы получить ответ, или вы можете получить массив в обработчике ответа.

  • Если пользователь добавляет/редактирует/удаляет объекты в массиве на Watch Watch как мы можем обновить данные на iPhone?

    Отправьте объект с новыми изменениями в вашем методе sendMessage с экрана на телефон, при приеме на телефоне изменения в базе данных сохранят его и отправят обновленное значение в вашем ответеHandler, чтобы содержимое вашего чата было обновлено соответственно.

  • Также приложение iOS встроено в UITabBarController, поэтому имеет ли значение, с каким контроллером представлений я общаюсь?

    Желаемый viewController, с которым вы общаетесь, или тот, который отвечает за выполнение изменений, должен быть в живых. Если несколько ViewControllers прослушивают WCSessionDelegates, то, когда вы отправляете какое-либо сообщение с экрана, все активные контроллеры получат это сообщение. Вы должны включить какой-то identifier в словарь sendMessage, чтобы вы могли узнать, какую операцию выполнить. Например, если вы хотите delete объект, тогда, когда watch отправляет сообщение, identifier будет содержать delete, так что при приеме вы можете проверить значение identifier и выполнить операцию delete.

Ответ 2

Вы можете использовать answerHandler в sendMessage для этого. Убедитесь, что вы реализуете обработчик ответа в приложении Watch и iOS, чтобы получить это.

В принципе, если вы понимаете это правильно, ваш обработчик ответа может гарантировать, что ваше приложение iOS делает в ответ на сообщение о приложении для просмотра.

Кроме того, говоря о вашем ответе (отправки массива объектов), вы должны отправить его в качестве словаря и получить его на часах.

Ответ 3

Во-первых, это действительно хороший вопрос. Для начала я бы рекомендовал вам посмотреть эту сессию с WWDC 2015: Session 713 - Знакомство с Watch Connectivity. Здесь можно найти .

Теперь на ваш реальный вопрос. Существует отличный учебник и Github repo, в котором показано, как передавать основные данные между вашим приложением Apple Watch и контейнером с помощью групп приложений, так как это позволяет получить доступ ко всему общему контенту, например, к базовым данным и даже к NSUSerdefaults.

Затем вы можете найти полный учебник о том, как это сделать, используя следующую ссылку .

Надеюсь, что это поможет, Джулиан.