2012-03-16 5 views
1

서버로가는 호출이 있습니다. UI 스레드가 아닌 보조 스레드에서 비동기 적으로 실행할 콜백을 원합니다. 여기 핵심 데이터가 멈추고 앱의 응답 성을 높이려고합니다. 이 콜백을 보조 스레드에서 실행하는 가장 좋은 방법은 무엇입니까? 코드 예제는 훌륭합니다!보조 스레드에서 Cocoa 블록 실행

[[SomeServer sharedInstance] doServerCallCallback:^(NSObject *param) { 

    NSManagedObjectContext *moc = [MYAPPDELEGATE managedObjectContext]; 

    /* do more stuff with param */ 

    [MYAPPDELEGATE saveManagedObjectContext]; 
}]; 

서버 호출 자체는 그러나 블록에서 실행되는 코드가 있어야 보조 스레드에있을 필요가 없습니다.

답변

1

백그라운드 스레드에 작업을하는 것이 쉽습니다. dispatch_async(), -[NSOperationQueue addOperationWithBlock:] 또는 심지어 사용중인 서버 연결과 관련된 내용 (예 : +[NSURLConnection sendAsynchronousRequest:queue:completionHandler:])을 사용하여 차단할 수 있습니다. (사용 예제는 문서의 내용을 참조하십시오.)

백그라운드 스레드에서 코어 데이터를 처리하려는 경우 iOS 5.0 이상을 사용하는 경우가 아니면 더러워집니다. 애플은 5.0 이전의 경우에 Concurrency and Core Data에 대한 큰 글을 올렸지 만, 제안한 것처럼 간단한 용도로 사용하기가 훨씬 쉽지만 새로운 것들은 문서화되어 있지 않다. 그래도 This question으로 시작해야합니다.

0

전달중인 블록은 서버가 어느 시점에서 실행하게 될 개체입니다. 블록을 다른 스레드에서 실행하려면 SomeServer의 구현을 -doServerCallCallback:으로 변경해야합니다.

블록 사용에 대한 전체 정보는 Grand Central Dispatch Reference 매뉴얼을 참조하십시오. 즉, 서버는 시작할 때 디스패치 대기열을 생성해야합니다. 그런 다음 dispatch_async()과 같은 기능을 사용하여 블록을 실행할 수 있습니다.

+0

SomeServer 구현을 변경할 필요가 없습니다. 전달한 블록은 작업을 오프 스레드 큐로 보낼 수 있습니다. –

+0

@GrahamLee 그것은 OP가 하나의 특정 블록이나 다른 스레드에서 실행되도록 서버로 전달 될 수있는 블록을 원하는지에 따라 다릅니다. 귀하의 접근 방식은 괜찮지 만 첫 번째 경우에만 가능합니다. 서버를 변경하면 모든 경우에 서버가 처리됩니다. – Caleb

관련 문제