2012-02-11 5 views
1

내 앱은 웹 서비스에 대한 정보를 업데이트해야합니다. 이 작업은 별도의 스레드에서 수행해야합니다. 할 일이 많은 다른 작업이기 때문에 단순히 ViewController에서 비동기 호출을하고 싶지 않습니다.콜백을해야하는 백그라운드 스레드에서 작업을 교체하는 방법

모든 응답을 받고 수행 한 경우 다른 스레드는 내 ViewController에서 대리인을 호출해야합니다.

구현 방법에 대한 팁과 기초를 알려주시겠습니까?

답변

0

NSOperationQueue를 사용하여 백그라운드 스레드에서 일련의 작업을 순서대로 수행 할 수 있습니다. 웹 서비스를 업데이트하고 순차적으로 작업을 수행하려면 NSURLConnection을 사용하여 업데이트를 수행하는 새 클래스를 만든 다음 NSURLConnection이 완료되면 NSOperationQueue를 시작할 수 있습니다.

2

NSURLConnection을 사용하여이 작업을 수행 할 수 있지만 코드는 매우 복잡합니다.

나는 백그라운드 스레드에서 비동기 웹 요청을 만들기위한 간단한 클래스를 작성했습니다. 여기에서 찾을 수 있습니다 : https://github.com/nicklockwood/RequestQueue

jsd가 제안한 NSOperationQueue와 비슷한 방식으로 작동합니다 (실제로 NSOperationQueue와 함께 사용할 수는 있지만). 사용하기 쉽습니다. 여기

당신이 내 클래스 사용하여 뷰 컨트롤러에서 요청을 얼마나 : 그것은 블록을 사용하기 때문에

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://someurl?foo=bar"]]; 
[[RequestQueue mainQueue] addRequest:request completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

    //do something with the response 

}]; 

, 당신은 대리자 메서드를 만들 필요가 없습니다에게, 당신은 당신의 처리 코드를 넣을 수 있습니다 직접 콜백 내부 ("응답으로 뭔가 할"주석을 달았습니다).

콜백 내부의 코드는 메인 스레드에서 호출되므로 백그라운드에서 다운로드가 완료된 후 요청을 실제로 시작한 후 몇 초 후에 호출됩니다. 델리게이트 메서드처럼.

+1

+1 공유 용. 호기심에서 왜 MKNetworkKit/AFNetworking/ASIHTTPRequest를 "재 구현"했습니까? 다른 말로하면, 당신의 구현을 그것들과 구별되게 만드는 것은 무엇입니까? – Till

+0

ASI는 포기되었으며 AFN은 ARC를 지원하지 않으며 MKN ... 지금까지는 들어 본 적이 없었습니다 .- 게다가 그들은 모두 "부엌 싱크대"솔루션입니다 - 나는 거대한 프레임 워크를 좋아하지 않습니다. 모든 것, 나는 혼합 할 수있는 단일 목적의 라이브러리를 선호합니다. –

관련 문제