0

如何通过 Watch Connectivity 将多个“应用程序更新”从手机发送到手表(例如数组中的多个不同值)?

我的应用程序更新成功地通过numberItem表格视图中选定单元格的值发送,但我还想通过选定单元格数组中的用户 ID 值发送。

现在,它只识别一个值,不会更新另一个值,而是将“请重试”显示为我的标签文本。

对于其他附加值(例如用户 ID 和用户名),我如何发送两个或多个应用程序更新。

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")
   }
}
4

1 回答 1

2

您不能单独发送项目,因为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)
}
于 2016-08-16T15:46:00.703 回答