Как обмениваться данными с помощью 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.
Затем вы можете найти полный учебник о том, как это сделать, используя следующую ссылку .
Надеюсь, что это поможет, Джулиан.