1

最初に、「transferUserInfo」メソッドを使用して、辞書を iPhone から Apple Watch に送信します。

let dicty = //...my dictionary of property-list values...
if WCSession.isSupported() {
    let session = WCSession.defaultSession()
    if session.paired == true {  // Check if your Watch is paired with your iPhone
        if session.watchAppInstalled == true {  // Check if your Watch-App is installed on your Watch
            session.transferUserInfo(dicty)
        }
    }
}

次に、次のデリゲート コールバック メソッド「didFinishUserInfoTransfer」を使用して、転送の状態を確認しています。

func session(session: WCSession, didFinishUserInfoTransfer userInfoTransfer: WCSessionUserInfoTransfer, error: NSError?) {
    if error == nil {
        let session = WCSession.defaultSession()
        let transfers = session.outstandingUserInfoTransfers
        if transfers.count > 0 {  //--> is always > 0, why ?????????
            for trans in transfers {
                trans.cancel()  // cancel transfer that will be sent by updateApplicationContext
                let dict = trans.userInfo
                session.transferUserInfo(dict)  //--> creates enless-transfer cycle !!!!!
            }
        }
    }
    else {
        print(error)
    }
}

Apple のドキュメントでは、 didFinishUserInfoTransfer メソッドについて次のように述べています。

The session object calls this method when a data transfer initiated by the
current app finished, either successfully or unsuccessfully. Use this method
to note that the transfer completed or to respond to errors, perhaps by
trying to send the data again at a later time.

これまでのところとても良いです-理解しました。しかし今、私には理解できないことがあります:

didFinishUserInfoTransfer が入力され、エラー == nil の場合、一体なぜ session.outstandingUserInfoTransfers COUNT がゼロよりも大きくなるのですか??????

Apple のドキュメントによると、didFinishUserInfoTransfer の唯一の非エラー状態は、転送が終了したときでなければなりません!! 少し終わっていないようです... なぜ???

これについて明確にしていただきありがとうございます。

また、これらの 3 つの方法を正しく使用する方法についてのコード例も嬉しいです。(すなわち

  • session.transferUserInfo(ディクティ)

  • didFinishUserInfoTransfer

  • session.outstandingUserInfoTransfers)

4

2 に答える 2

1

コールバックをトリガーする userInfoTransfer は、デリゲート コールバックが返されるまでdidFinishUserInfoTransfer削除されないようです。outstandingUserInfoTransfers必要な動作 (count が 0 になる可能性がある場所) を得るには、デリゲート コールバック スレッドから Dispatch_async を離す必要があります。したがって、これは機能するはずです:

func session(session: WCSession, didFinishUserInfoTransfer userInfoTransfer: WCSessionUserInfoTransfer, error: NSError?) {
    if error == nil {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            let transfers = session.outstandingUserInfoTransfers
            if transfers.count > 0 {  //--> will in most cases now be 0
                for trans in transfers {
                    trans.cancel()  // cancel transfer that will be sent by updateApplicationContext
                    let dict = trans.userInfo
                    session.transferUserInfo(dict)  // ***
                }
            }
        });
    }
    else {
        print(error)
    }
}

とは言っても、残りの未処理の userInfoTransfers のいずれかが完了するたびに、それらを再キューイングするためにすべてキャンセルする理由がよくわかりません (問題の場所は で示されます***) 。

于 2016-01-14T16:53:27.230 に答える