2014-02-19 5 views
2

배송되는 iPhone 앱에서 문제없이 dispatch_async 블록을 사용했습니다. 앱은 웹 사이트에서 가격 업데이트를 확인하고 HTML을 파싱하고, 이에 따라 핵심 데이터 모델을 업데이트 한 다음,보고있는 테이블을 새로 고칩니다.작업이 완료되지 않은 경우 iPhone app가 dispatch_async로 중단됩니다.

그러나 최신 앱에서는 가격 업데이트 프로세스가 실행되는 동안 앱을 사용 중지 할 수 있음을 발견했습니다. 첫 번째와 두 번째 사용법의 차이점은 내가 테이블의 refreshController (즉, tableViewController의 풀 - 투 - 리프레시 메커니즘에 내장 된) 디스패치 블록을 호출하고 있으며 이것이 iOS7임을 알 수 있습니다.

누군가가 프로세스를 중지하려는 사용자와 같이 알려진 조건 하에서 정상적으로 중단되어야하는 방법을 제안 할 수 있습니까? 아니면이 앱을 전환하고 해당 블록을 적절하게 관리하기 위해 가로 채고 싶습니다. 제발?

좋은 배경을 블록으로 읽지 않고 읽지 않는 경우에도 이와 같은 링크를 살펴 보는 것이 기쁩니다. 감사합니다.

은 사용자의 편의를 위해, 내가 사용하고있어 (주로 보일러) dispatch_async 코드 :

priceData = [[NSMutableData alloc]init];  // priceData is declared in the header 
priceURL = …  // the price update URL 

NSURL *requestedPriceURL = [[NSURL alloc]initWithString:[@“myPriceURL.com”]]; 
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:requestedPriceURL]; 

dispatch_queue_t dispatchQueue = dispatch_queue_create("net.fudoshindesign.loot.priceUpdateDispatchQueue", NULL); //ie. my made-up queue name 
dispatch_async(dispatchQueue, ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:urlRequest delegate:self startImmediately:YES]; 
      [conn start]; 
     }) 
}); 

답변

0

취소하는 파견 큐에 없는 명시 적 조항이있다. 기본적으로 semaphore이됩니다.

NSOperationQueue (더 높은 수준의 추상화이지만 여전히 GCD을 사용하여 빌드 됨)에는 작업 취소가 지원됩니다. 일련의 NSOperations를 만들어 NSOperationQueue에 추가 한 다음 완료 할 필요가 없을 때 대기열에 cancelAllOperations 메시지를 보낼 수 있습니다.

유용한 링크 : 상용구 코드가 꽤 쓸모가 보이는

http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/

Dispatch queues: How to tell if they're running and how to stop them

2

있다.

직렬 대기열을 만듭니다. 주 큐에서 블록을 디스 패칭하는 것 외에는 아무것도 수행하지 않는 큐에 블록을 디스패치합니다. 메인 대기열에서 직접 전달할 수도 있습니다.

1

비동기 블록이 있지만 해당 블록의 주 스레드에서 NSURLConnection 요청을 실행 중이지만 프로세스가 완료되지 않으면 응용 프로그램이 중단되는 이유입니다. 백그라운드 스레드에서 요청을 실행하십시오. 이 코드에서 주 스레드를 차단하고 있습니다.

당신은 이런 식으로 작업을 수행 할 수 있습니다

dispatch_queue_t dispatchQueue = dispatch_queue_create("net.fudoshindesign.loot.priceUpdateDispatchQueue", 0); //ie. your made-up queue name 
dispatch_async(dispatchQueue, ^{ 
     NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:urlRequest delegate:self startImmediately:YES]; 
     [conn start]; 
     ... 
     //other code 
     ... 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      //process completed. update UI or other tasks requiring main thread 
     }); 
    }); 

시도 읽기 및 GCD에 대한 자세한 내용을 연습.

Grand Central Dispatch (GCD) Reference from Apple Docs

GCD Tutorial

+0

그냥 알고 , 그것은'dispatch_async'에서'대신'의 UIViewController __weak weakSelf = self'의 self'를 사용하는 것이 안전합니다? –

+0

예 비동기 블록에서 자기를 사용하는 것이 안전합니다 ..하지만 U 백그라운드 스레드 블록에서 UI를 업데이트 할 수 없습니다. –

+0

감사합니다. ~ 알아 둘만한 –

관련 문제