数日間複雑な作業を行った後、所定の間隔で発生する更新の更新プロセスについて、次のように自信を持って言えます。
- システムコール
requestedUpdateDidBegin()
- ここで、データが変更されたかどうかを判断できます。そうでない場合、アプリは何もする必要はありません。データが変更された場合は、次のいずれかを呼び出す必要があります。
reloadTimelineForComplication
すべてのデータをリセットする必要がある場合。extendTimelineForComplication
コンプリケーション タイムラインの最後に新しいアイテムを追加するだけでよい場合。
- 注: 1 日のコンプリケーションの時間予算を使いすぎた場合は、
requestedUpdateBudgetExhausted()
代わりにシステムが実際に呼び出すことがあります。requestedUpdateDidBegin()
これがこの質問の理由です。
- ここで、データが変更されたかどうかを判断できます。そうでない場合、アプリは何もする必要はありません。データが変更された場合は、次のいずれかを呼び出す必要があります。
- を呼び出した場合
reloadTimelineForComplication
、システムはgetCurrentTimelineEntryForComplication
(時間旅行の設定に応じて、配列を取得する未来および過去のバリアントと共に)を呼び出します。 - まだテストしていないため、これは推測ですが、それを呼び出すと
extendTimelineForComplication
、 のみが呼び出されると思いますgetTimelineEntriesForComplication(... afterDate date: NSDate ...)
。 - その後、システムが呼び出さ
getNextRequestedUpdateDateWithHandler
れるので、コンプリケーションが新しいアップデートを必要とするまでの時間を指定できます。
Apple のドキュメントでは、頻繁に更新を要求したり、コンプリケーション コードで処理を実行しすぎたりしないでください。そうしないと、時間予算が使い果たされ、コンプリケーションの更新が停止します。それで、私の質問は次のとおりです。いつ、どこで更新を行いますか?
コンテキストとして、私のシナリオは、1 時間に最大 2 回変化する戻りデータを含む URL です。
URL 取得コードを配置する最も明白な場所はfunc requestedUpdateDidBegin()
、データを取得して保存し、変更がない場合は単に戻ることです。変更があった場合は、タイムラインを延長またはリロードします。
ただし、URL フェッチにはコストがかかる場合があります。代替案:
- コードを電話アプリに入れ、 を付けて送信し
WCSession
ますが、ユーザーがそのアプリを閉じると、更新は行われなくなります。 - プッシュ アップデートを使用しますが、これは Web アプリではないため、送信元がありません。
- 明らかに、ユーザーが時計アプリを操作するときにすべてのデータを更新しますが、これは、ユーザーがアプリを使用するときにのみ更新されることを意味し、複雑さの必要性を否定します.
他の場所はありますか?コンプリケーションに含まれていない時計アプリの定期的な機能を使用できますか? 合併症の更新のためにデータを取得する適切な場所はどこですか?