5

すべてのデータ作成は で行われますExtensionDelegate.swift

問題は、 myExtensionDelegate.swiftgetCurrentTimelineEntryForComplicationComplicationController.swiftの関数の前に呼び出されないことです。

何か案は? ここに私のコードと詳細があります:

したがって、私の配列extEvntsは my で空ですComplicationController.swift:

    func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) {

        let extEvnts = ExtensionDelegate.evnts
}

myExtensionDelegate.swiftはまだ呼び出されていないため、配列のデータが作成されます。

class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate {

    private let session = WCSession.defaultSession()
    var receivedData = Array<Dictionary<String, String>>()
    static var evnts = [Evnt]()

    func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {

        if let tColorValue = userInfo["TeamColor"] as? String, let matchValue = userInfo["Matchup"] as? String {

            receivedData.append(["TeamColor" : tColorValue , "Matchup" : matchValue])
            ExtensionDelegate.evnts.append(Evnt(dataDictionary: ["TeamColor" : tColorValue , "Matchup" : matchValue]))

        } else {
            print("tColorValue and matchValue are not same as dictionary value")
        }

    }

    func applicationDidFinishLaunching() {
        // Perform any final initialization of your application.
        if WCSession.isSupported() {
            session.delegate = self
            session.activateSession()
        }
    }
}

編集:

Apple によると、これは何か関係があるように見えますが、何らかの理由で、 を呼び出すことができないため、実際に実装する方法がわかりませんmydelegate.evnts:

// Get the complication data from the extension delegate.
let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate
var data : Dictionary = myDelegate.myComplicationData[ComplicationCurrentEntry]!

だから私はこのようなことを試しましたが、まだデータを取得していないため、まだ機能していません:

func someMethod() {
    let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate
    let dict = ExtensionDelegate.evnts
    print("ExtensionDel.evnts: \(dict.count)")

}

4

2 に答える 2

3

TL/DR:データを受信したClockKit、拡張機能にコンプリケーションを更新するように伝えます。

創刊:

したがって、配列 extEvnts は ComplicationController.swift で空です ... ExtensionDelegate.swift がまだ呼び出されていないため、配列のデータが作成されます。

その時点でデータが受信されていないため、配列は空です。

まだ送信されていない可能性のあるデータを時計(拡張機能)に強制的に受信させる(複雑化コントローラーを取得する)ことはできません。

WCSession Class Referenceを見るとtransferUserInfo、システムが情報を送信するのに適した時期であると判断したときに、バックグラウンドで転送されるデータをキューに入れます。

バックグラウンド転送はすぐには配信されないことに注意してください。システムは可能な限り迅速にデータを送信しますが、転送は即時ではなく、システムは電力使用を改善するために転送をわずかに遅らせる場合があります。また、大きなデータファイルを送信すると、データを他のデバイスに送信し、受信側で処理するのに相応の時間が必要になります。

2 番目の問題:

携帯電話から送信されたデータに基づいて、アプリの更新と複雑さを組み合わせようとしています。ただし、アプリと複雑な機能は必ずしも一緒に実行されるとは限りません。データが送受信される前に時計がコンプリケーションを更新することは、驚くべきことでも予想外なことでもありません。watchOSのアプリ プログラミング ガイドには、次のように記載されています。

複雑さは完全に WatchKit 拡張機能に存在します。ユーザー インターフェイスは、Watch アプリでは定義されていません。代わりに、CLKComplicationDataSource プロトコルを実装するオブジェクトによって定義されます。watchOS がコンプリケーションを更新する必要がある場合、WatchKit 拡張機能を起動します。ただし、Watch アプリの実行可能ファイルは起動されません。

コンプリケーション コントローラーが、「待ってください。更新を提供する準備ができていません。コンプリケーション コントローラーは、ウォッチ拡張機能がデータを受信するのを待つことはできません (または、前述のように、強制することもできません)」と言うメカニズムはありません。

唯一の責任は、現在利用可能なものに基づいてデータをすぐに返すことです。データがない場合は、空のタイムラインを返す必要があります。

この問題へのアプローチ:

アプリのアップデートとコンプリケーションのアップデートを必ずしも同じものと考えるべきではありません。1 つ目は予算化されていませんが、2 つ目は予算化されています。コンプリケーションを頻繁に更新すると、1 日の予算を超える可能性があり、その日の残りの時間はそれ以上の更新は行われません。

合併症は頻繁に更新されることを意図していません。コンプリケーションは、各更新サイクル中にできるだけ多くのデータを提供する必要があります。数分以内にコンプリケーションを更新するようにシステムに要求するべきではありません。数時間または 1 日続くデータを提供する必要があります。

それをカバーしたら、拡張機能がデータを受信するまで待ってからClockKit、タイムラインの延長を依頼して、新しいエントリを追加することができます。クラスリファレンスextendTimelineForComplication:に記載されています。CLKComplicationServer

余談ですが、データが緊急の場合は、 を使用する必要がありますtransferCurrentComplicationUserInfo。これは優先度の高いメッセージであり、キューの先頭に配置され、拡張機能が起動されて受信されます。それとの比較については、この回答を参照してくださいtransferUserInfo

また、ウォッチ アプリとコンプリケーション コントローラーの両方が使用するデータを保持するシングルトンをセットアップすることもできます。これはあなたの古い質問への回答で言及されており、開発者フォーラムで Apple の従業員からも推奨されています。

于 2016-02-22T03:53:59.053 に答える
3

ここで私を助けた便利な質問

この機能requestedUpdateDidBegin()では、コンプリケーションに表示する情報を更新できます。したがって、このメソッドでは、sendMessage:replyHandler:errorHandler:WatchConnectivityなどのメソッドを使用して親アプリを呼び出し、新しい情報を受け取ることができます。

を使用NSUserDefaultsして、 で使用される命令型データを保存し、ComplicationControllerこの情報を からコンプリケーションにロードできNSUserDefaultsます。このデータをユーザーの既定値に保存して、新しいデータの読み込みに失敗した場合に備えて常に古いデータを表示できるようにします。

于 2016-02-22T21:11:09.333 に答える