0

ウォッチ コネクティビティを使用して、携帯電話からウォッチに複数の「アプリケーション アップデート」(配列からの複数の異なる値など) を送信するにはどうすればよいですか?

アプリケーションの更新はnumberItem、テーブル ビューで選択したセルから値を送信するのに成功しましたが、選択したセル配列からもユーザー ID 値を送信したいと考えています。

現在、それは 1 つの値のみを認識し、他の値を更新しませんが、ラベル テキストとして「再試行してください」と表示します。

他の追加の値 (ユーザー ID やユーザー名など) について、2 つ以上のアプリケーション更新を送信するにはどうすればよいですか。

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以前のアプリケーション コンテキスト データを最新のデータに置き換えた場合と同様に、アイテムを個別に送信することはできません。これは、ドキュメントの2 つの異なる場所で簡単に言及されています。

このメソッドは、以前のデータ ディクショナリを上書きします...

このメソッドは、設定された以前の辞書を置き換えます...

当然のことながら、Apple はエネルギー/メモリ効率のためにプロセス全体を最適化します。この場合、2 番目のデータが送信のためにキューに入れられたときに、以前のアプリケーション コンテキスト データがまだ送信されるキューにあった場合、以前のデータを破棄して、不必要に送信/保存する必要がないようにすることができます。あなたの時計は最初のデータさえ受信していないでしょう。

時計は 2 つのデータのうち 1 つしか受信していないため、1 つのキーについて受信した辞書を確認したときに「再試行してください」と表示されたのに、もう 1 つのキーのデータしか含まれていなかった理由はこれで説明できます。

一度に複数のアイテムを送信する方法

両方の項目を同じ辞書に含め、その辞書を 1 回の転送で送信します。

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 に答える