2

ユーザーがログインした後、バックグラウンドでサーバーからデータをダウンロードできるようにしたいと思います。ユーザーがプログラムのそのセクション(ダウンロードレシピなど)に移動したときに、それを設定できる方法はありますか?まだ保存されていない新しいレシピの現在のダウンロードがあるかどうかを確認できますか?

ユーザーがレシピにアクセスし、現在新しいレシピをダウンロード中であることを示す何らかのインジケーターが表示されると便利です。

スレッドに名前を付けることができますか? すべての「レシピ」スレッドをスタックに入れて、それが空であるか、スレッドがあるかどうかを確認できますか?

GCDを使用しています。

何か案は?

4

2 に答える 2

3

ディスパッチキューの状態を確認するのではなく、モデルにダウンロードの状態を示すプロパティを設定することをお勧めします。ダウンロードの開始時にGCDコードの状態を「ダウンロード中」に変更し、ダウンロードが完了したときにその状態を別の状態に戻すことができます。このバックグラウンドダウンロード操作と対話する複数のViewControllerがあるように見えるため、モデルの状態に依存するビューが適切なタイミングで更新できるように、ローカル通知(またはKVN)を使用することをお勧めします。

ディスパッチキューの代わりに操作キューを使用する場合(同時ダウンロードが必要であるが、これをある程度の妥当な数に制限したいなど、他の理由でも役立ちます)、理論的には使用できますがoperationCount、それでも維持する傾向があります上記のダウンロードステータスモデルプロパティ。

于 2013-03-08T16:29:26.743 に答える
3

dispatch_group_notifyこれは、GCDを使用する場合に行うことです(テストされていませんが、ダウンロードが完了したときに、ダウンロードプロセスの状態を示すグローバルフラグと組み合わせて使用​​できるという教訓が得られ ます)。

-(void)downloadRecipes
{
    //<--Start activity indicator-->
    //isDownloading = YES; //<- Some global flag to indicate download in progress
    //--or--
    //[[NSNotificationCenter defaultCenter] postNotificationName:@"DownloadDidBegin"];
    dispatch_block_t executionBlock = 
        ^{
              //Your download logic here
         };
    dispatch_block_t executionBlock_OnComplete =
        ^{
             //isDownloading = NO; //<- Global flag indicates no longer downloading
             //--or--
             //[[NSNotificationCenter defaultCenter] postNotificationName:@"DownloadDidEnd"];
             //<--Stop activity indicator-->
         };
    dispatch_queue_t someQueue = dispatch_queue_create("com.myapp.recipe.download", NULL);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, someQueue, executionBlock);
    dispatch_group_notify(group, dispatch_get_main_queue(), executionBlock_OnComplete);
    dispatch_release(group);
    dispatch_release(queue);
}

オプションで、グローバルフラグを設定する代わりにNSNotificationCenter、プロセスの開始時と完了時に通知を投稿するために使用できます。

于 2013-03-08T16:34:10.587 に答える