Как отправить через несколько словарей / несколько "обновлений приложения" с возможностью подключения swift 2.2 watch

Как можно отправить несколько "обновлений приложения" со своего телефона на часы (например, через несколько разных значений из массива) с помощью Watch Connectivity?

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

Сейчас он распознает только одно значение и не обновляет другое значение, но отображает "пожалуйста, повторите" в качестве текста моей метки.

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

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let numberItem = number[indexPath.row]
    print("tableview select #:")
    print(numberItem)
    do {
        try WatchSessionManager.sharedManager.updateApplicationContext(["number" : numberItem])
    } catch {
        let alertController = UIAlertController(title: "Oops!", message: "Looks like your \(numberItem) got stuck on the way! Please send again!", preferredStyle: .Alert)
        presentViewController(alertController, animated: true, completion: nil)
    }
    let uidItem = 15
    //let uidDict = ["uidValue":uidItem]
    print("the send UID is")
    //print(uidItem)
    do {
        try WatchSessionManager.sharedManager.updateApplicationContext(["uidValue" : uidItem])
    } catch {
        let alertController = UIAlertController(title: "Oops!", message: "Looks like your \(uidItem) got stuck on the way! Please send again!", preferredStyle: .Alert)
        presentViewController(alertController, animated: true, completion: nil)
    }
}

Мой файл datasource.swift:

    enum Item {
    case Number(String)
    case uidValue(String)
    case Unknown
}

init(data: [String : AnyObject]) {
    if let numberItem = data["number"] as? String {
        item = Item.Number(numberItem)
        print("enum item is")
        print(numberItem)
    } else if let uidItem = data["uidValue"] as? String {
        item = Item.uidValue(uidItem)
        print("enum item is")
        print(uidItem)
    } else {
        item = Item.Unknown
    }
}

и мой контроллер интерфейса на часах (подключен к моим меткам данных) включает в себя:

func dataSourceDidUpdate(dataSource: DataSource) {
   switch dataSource.item {

   // the first application update- commented out to try the 2nd update
   //case .Number(let numberItem):
    //    titleLabel.setText(numberItem)
    //    print(numberItem)

   // the second application update
   case .uidValue(let uidItem):
       uidLabel.setText(uidItem)
       print(uidItem)
   case .Unknown:
       nidLabel.setText("please retry")
   default:
    print("default")
   }
}

1 ответ

Решение

Вы не можете отправить вещи отдельно, так как updateApplicationContext заменил бы любые более ранние данные контекста приложения самыми последними данными. Это кратко упоминается в двух разных местах в документации:

Этот метод перезаписывает предыдущий словарь данных,...

Этот метод заменяет предыдущий словарь, который был установлен,...

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

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

Как передать более одного предмета одновременно

Включите оба элемента в один и тот же словарь и передайте этот словарь с помощью одной передачи.

let data = ["number" : numberItem, "uidValue" : uidItem]
try WatchSessionManager.sharedManager.updateApplicationContext(data)
...

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

if let numberItem = data["number"] as? String {
    titleLabel.setText(numberItem)
}
if let uidItem = data["uidValue"] as? String {
    uidLabel.setText(uidItem)
}
Другие вопросы по тегам