Как поделиться данными с Watch OS 2 для отображения в WKInterfaceTable при работе с CoreData

Я использую WatchConnectivity, чтобы попытаться отправить данные типа NSManagedObject с именем arrayOfOjects в Watch. Каждый object имеет строковое свойство с именем title.

InterfaceController на часах загружает и отображает пустую таблицу - как и предполагалось, потому что массив пуст, а затем, когда пользователь запрашивает данные, они отправляются с использованием метода didReceiveMessage на телефоне.

Я не знаю, как добавить массив словарей в objectArray для отображения в файле WKInterfaceTable.

Кто-нибудь знает, как я могу отправить данные на часы для отображения в таблице, чтобы внести изменения и синхронизировать их с телефоном?

Apple Watch:

class ObjectsInterfaceController: WKInterfaceController, WCSessionDelegate {

var session : WCSession!
var objectsArray = [[AnyObject]]()

@IBOutlet var table: WKInterfaceTable!
@IBOutlet var titleLabel: WKInterfaceLabel!

func loadTableData() {

    table.setNumberOfRows(self.objectsArray.count, withRowType: "CellRow")
    if self.objectsArray.count > 0 {
        for (index, name) in self.objectsArray.enumerate() {
            let row = self.table.rowControllerAtIndex(index) as! CellRowController
            row.objectCellLabel.setText(name.title)
        }
    }
}

override init() {
    super.init()
    loadTableData()
}

override func awakeWithContext(context: AnyObject?) {
    super.awakeWithContext(context)
    // Interface Objects
}

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()
    }
}

//Swift
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {

    let value = message["Value"]

    dispatch_async(dispatch_get_main_queue()) {
        self.objectsArray.removeAll()
        self.objectsArray.append(value! as! Array)
        self.loadTableData()
    }

    //send a reply
    replyHandler(["Value":"Yes"])

}
}

iPhone

Я уже извлекаю все объекты и сохраняю их в массиве.

var objectsArray = [Objects]()

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {

    //send a reply
    replyHandler(["Value": [objectsArray]])

}

Мне нужно иметь возможность изменять свойства объектов и сохранять изменения на iPhone, но я даже не могу отправить данные и отобразить их в таблице :( Мне удалось отправить простые строковые значения в словаре между устройствами, но не массивы или фактические данные.


person RileyDev    schedule 10.03.2016    source источник
comment
Вы не можете совместно использовать NSManagedObject между (контекстами, потоками или) устройствами.   -  person    schedule 11.03.2016
comment
Не могли бы вы опубликовать код из приложения iOS, которое отправляет имена на часы?   -  person ccjensen    schedule 11.03.2016


Ответы (1)


TL/DR:

Вы можете отправлять на часы только базовые типы (такие как строки, целые числа, двойные числа). В этом вопросе содержится более подробная информация об отправке пользовательских объектов.

Другая проблема:

Даже если вы заархивировали или сериализовали управляемые объекты, все равно невозможно отправить эти данные с телефона на часы.

NSManagedObject действителен только внутри своего собственного контекста. В этом случае управляемый объект регистрируется с помощью определенного NSMangedObjectContext в вашем приложении iOS. Управляемый объект бесполезен вне своего контекста, а его контекст управляемого объекта не существует нигде, кроме телефона.

Экземпляры NSManagedObject не предназначены для передачи между очередями. Это может привести к повреждению данных и закрытию приложения. Когда необходимо передать ссылку на управляемый объект из одной очереди в другую, это необходимо сделать через экземпляры NSManagedObjectID.

Поскольку невозможно передать управляемый объект из одного контекста (потока или очереди) в другой на той же платформе, вы определенно не сможете передать управляемый объект между телефоном и сопряженными с ним часами.

Что вы можете сделать?

  • Если бы у вас был способ разделить хранилище основных данных между телефоном и часами, вы могли бы преобразовать идентификаторы управляемых объектов в строки (используя URIRepresentation), затем передать эти строки часам, а затем преобразовать эти строки обратно в идентификаторы объектов и получить их. соответствующие объекты. Это подробно объясняется в этом вопросе.

    Однако группы приложений больше не поддерживаются в watchOS 2, и было бы очень сложно синхронизировать два разных магазина на разных устройствах.

  • Гораздо более простое решение — передать информацию о заголовке, отслеживать любые изменения, которые вы вносите в часы, а затем отправлять обратно словарь заголовков, которые были вставлены, удалены или изменены иным образом.

    Затем телефон обновит управляемые объекты, соответствующие этим измененным заголовкам.

    Это похоже на то, как NSFetchedResultsControllerDelegate реагирует на изменения, чтобы синхронизировать результаты.

Кто-нибудь знает, как я могу отправить данные на часы для отображения в таблице, чтобы внести изменения и синхронизировать их обратно с телефоном?

Я дал вам общий обзор. Что-либо более подробное было бы слишком широким, чтобы охватить его в этом ответе. Все, что я могу предположить, это то, что разработчики либо использовали сторонний фреймворк, либо написали собственную реализацию.

Некоторые соображения:

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

Если вы можете упростить дизайн своего приложения для часов (например, помечая только элемент списка дел как завершенный), вы можете устранить большую часть накладных расходов на «синхронизацию» и делегировать более сложные задачи приложению iOS.

person Community    schedule 13.03.2016
comment
Использование фреймворка WatchConnectivity для отправки словаря на часы — не проблема. У меня проблема с запросом на выборку по телефону (только для отправки некоторых данных). Может быть, у вас есть намек на это? stackoverflow.com/questions/47734060/ - person alexkaessner; 20.12.2017