2012-03-01 3 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

고맙습니다. @gregheo – acecapades

+0

또 다른 블록에 콜백 비즈니스를 수행하도록 다시 대기열에 넣을 수도 있습니다. 다시 'dispatch_async'를 사용하지만, 실제로 그렇게하지 않을 이유가 없습니다. 너 여기 쓴거야. (나는 왜 이것이 질문 이었는지 이해할 수 없다 ...) –

+0

'doneChecking'이 메인 요소에서 수행되어야하는 모든 UI 요소에서 작동 할 것이고 fetchQ에서는 작동하지 않을 것이라는 점을 지적 할 가치가있다. 다른 디스패치 호출을 사용하지만 기본 대기열을 요청하십시오. –

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

관련 문제