2012-03-01 12 views
4

スレッドでデータのオンラインフェッチを実行していますが、ブロックの実行直後に何かしたいです。ブロック、コンプリートハンドラ、dispatch_asyncとdispatch_syncの対処

ここに私のコードです:

- (IBAction)refresh:(UIBarButtonItem *)sender { 
    NSLog(@"checking"); 
    [self editToolbar]; 
    dispatch_queue_t fetchQ = dispatch_queue_create("Refreshing", NULL); 
    dispatch_async(fetchQ, ^{ 
     [self setupFetchedResultsController]; 
     [self fetchImonggoItemsDataIntoDocument: self.itemDatabase]; 
    }); 
    dispatch_release(fetchQ); 

    NSLog(@"done checking"); 
    //do something here 
} 

事はすぐにdispatch_asyncリターンで、ブロックの実行が行われる前であっても、すぐにプリントを「チェック済」。これをどうすれば解決できますか?

+3

ブロックの最後に何をしたいのですか?あなたの質問を誤解していますか? –

+1

'performBlock:'がすぐに返ってくる(非同期で動く)という問題はありますか?バックグラウンドスレッド上にある限り、常に 'performBlockAndWait:'があります。 – gregheo

+0

@gregheo私の編集した質問をご覧ください。 :)ありがとう! – acecapades

答えて

4

私はアーキテクチャ上の問題だと思います。これらは、私はかなりまたはブロックの使用を理解していないために、正確に行われなければならない場合

  1. 編集ツールバー
  2. fetchImonggoItemsDataIntoDocument
  3. 何か他のもの

の操作を行います。タスクは、のようなものがありますキュー;お互いに文を実行するだけで、あなたは設定されます。

そうでなければ、代替#1はdispatch_asyncではなくdispatch_syncを使用することになります。繰り返しますが、キューを使用する利点はどれくらいあるのかよく分かりませんが、そこにはあります。

代替番号2は、ブロックからのコールバックを使用することです。何かのように:

- (IBAction)refresh:(UIBarButtonItem *)sender { 
    NSLog(@"checking"); 
    [self editToolbar]; 
    dispatch_queue_t fetchQ = dispatch_queue_create("Refreshing", NULL); 
    dispatch_async(fetchQ, ^{ 
     [self setupFetchedResultsController]; 
     [self fetchImonggoItemsDataIntoDocument: self.itemDatabase]; 
     [self doneChecking]; // <-- NOTE! call the callback 
    }); 
    dispatch_release(fetchQ); 
} 

// NOTE! refresh: has been split up into two methods 
- (void)doneChecking: 
    NSLog(@"done checking"); 
    //do something here 
} 
+0

感謝@repheo – acecapades

+0

もう一度 'dispatch_async'を使ってコールバックビジネスを行うために別のブロックをエンキューすることも可能ですが、実際にはそれをやり遂げる理由はありませんあなたはここに書きました。 (私はなぜこれが質問だったのか理解できません...) –

+0

'doneChecking'がメインのスレッドで実行されるべきで、fetchQではなく実行されるべきUI要素で動作することを指摘しておきましょう。別のディスパッチコールを使用しますが、ただメインキューを要求してください。 –

1

他の人が既に提案しているように、これはおそらく必要なものです。

NSArray *items = [iMonggoFetcher fetchImonggoData:IMONGGO_GENERIC_URL_FOR_PRODUCTS withFormat:@"json" withDateRangeArgs:args]; 
[document.managedObjectContext performBlock:^{ 
    for (NSDictionary *itemInfo in items){ 
     [Product productWithImonggoInfo:itemInfo inManagedObjectContext:document.managedObjectContext]; 
    } 
    // Put here what you need :) 
}]; 
+0

私の編集した質問を参照してください.... – acecapades

関連する問題