widgetPerformUpdateWithCompletionHandler()
Today Extension のコンテンツが変更されたかどうかを通知センターに知らせることができます。例えば:
func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)!) {
// Refresh the widget's contents in preparation for a snapshot.
// Call the completion handler block after the widget's contents have been
// refreshed. Pass NCUpdateResultNoData to indicate that nothing has changed
// or NCUpdateResultNewData to indicate that there is new data since the
// last invocation of this method.
if(has_new_data()) { // There was an update
completionHandler(.NewData)
}
else { // nothing changed!
completionHandler(.NoData)
}
}
しかし、コンテンツが変更されたかどうかはどうすればわかりますか? すべてのスナップショットで、ウィジェットはゼロからインスタンス化されます。新しい PID を持つ完全な新しいプロセスです。したがって、インスタンスにプロパティを保存することはできません。現在のウィジェットのコンテンツを以前のスナップショットのコンテンツと比較するにはどうすればよいでしょうか?
Core Data を使用して、後で比較できるように現在のコンテンツを保存しました。これは明らかで機能します。しかし、別の問題が発生します。以前のスナップショットがない場合はどうなりますか? ユーザーが再びウィジェットを追加するためだけにウィジェットを削除したとします。または、ユーザーが再起動しました。今では考えられない以前のスナップショットがない理由は他にもあるかもしれません。いずれにせよ、Core Data にはまだコンテンツが保存されています。この古いコンテンツと現在のコンテンツを比較して変更がないことが検出.NoData
された場合、通知センターはコンテンツを再描画しないため、ウィジェットは空になります。
completionHandler
単に常に を返すのではなく、正しい状態でを呼び出すことがなぜ私にとって非常に重要なのか疑問に思われるかもしれません.NewData
。これは、変化がなく、まだ戻っているときに少しちらつきが発生しているためです.NewData
。ウィジェットにいくつかの画像があり、ウィジェットを再描画すると、コンテンツ全体がミリ秒間見えなくなります-気付くのに十分な時間です。
足りないものはありますか?Apple がさまざまな状態で応答するオプションを提供する方法を提供しているのに、どの状態に応答する必要があるかを検出することを不可能にしているのは、私には奇妙に思えます。