私の使用例はかなり一般的だと思いますが、私が何をしているのかを 100% 確信できるドキュメントは見つかりませんでした。どんなポインタでも大歓迎です。
アプリのある時点で、オブジェクトのダウンロードを開始します。その後、ユーザーはボタンをクリックできます。オブジェクトのダウンロードが完了したら、コードを実行したいと思います。それ以外の場合は、オブジェクトがダウンロードされるまで待ってから、同じコードを実行します。ユーザーがボタンをクリックしない場合、何もしたくありません。ダウンロードされたオブジェクトは失われます。
私の基本的なアイデアは、次のようなことをすることでした:
NSObject *myObj = nil;
- (void)download {
[self downloadObj:^(NSObject *obj){
myObj = obj;
}];
}
- (void)buttonClicked {
waitOrExecuteDirectly:^{
// Some code with myObj
}
}
もちろん、最初の問題は「どうやって待つか」です。
だから私は
- (void)buttonClicked {
if(myObj) {
// Some code
} else {
// Wait then do the exact same code
}
}
しかし、よりトリッキーな問題は、「「if」が計算された直後で、「else」ブロックに入る前にオブジェクトのダウンロードが終了するとどうなるかということだと思います。
ダウンロードを 内にカプセル化し、プロパティNSOperation
を使用しようとしました。completionBlock
しかし、コールバックを設定したときに操作が既に終了している場合、completionBlock は呼び出されません。ユーザーがボタンをクリックしない可能性があるため、「ダウンロード」メソッドにコールバックを設定したくありません。
タスクのステータスに応じて待機または直接実行する完了コールバックをタスクに与えることができる組み込みのメカニズムはありますか? そうでない場合、自分で行うためのベストプラクティスは何ですか? NSLock
設定および読み取り時に使用しmyObj
ますか?