如何通过多个词典/多个应用程序更新发送'搭配swift 2.2手表连接

时间:2016-08-16 10:20:41

标签: swift watch-os-2 watchconnectivity wcsession

如何通过多个应用程序更新发送'从手机到手表,(如阵列中的几个不同值)和Watch Connectivity?

我的应用程序更新成功地通过表视图中所选单元格的numberItem值发送,但我还希望通过所选单元格数组中的userid值发送。

目前,它只识别一个值,并且不会更新其他值,但会显示“请重试”#39;作为我的标签文字。

如何通过两个或多个应用程序更新发送其他附加值(例如用户标识和用户名)。

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 个答案:

答案 0 :(得分:2)

您不能单独发送这些项目,因为updateApplicationContext会用最新的数据替换任何早期的应用程序上下文数据。这在the documentation中的两个不同位置简要提及:

  

此方法会覆盖以前的数据字典,...

     

此方法替换以前设置的字典,...

当然,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)
}