2011-02-05 1 views
0

나는 MGTwitterEngine을 사용하여 트위터에서 트윗을 가져옵니다. 이것은 비동기 패러다임을 사용하여 다른 스레드에서 트위터를 가져옵니다. 가져온 결과를 주 스레드로 반환합니다.다른 스레드가 객관적으로 완료 될 때까지 기다려주십시오

트윗을 가져온 후에도 처리 할 작업이 있으므로 UI ​​스레드를 잠그지 않도록 다른 스레드를 소개하고 싶습니다. 다음과 같이하고 싶습니다. UI 스레드가 새 스레드 X를 시작합니다. 스레드 X가 MGTEngine을 사용하여 트윗의 비동기 가져 오기를 시작하고 이 완료 될 때까지이 대기합니다. MGTwitterEngine이 반환되면 스레드 X가 트윗을 처리하고 UI 스레드에 준비되었음을 알립니다.

내 질문은 : 어떻게 MGTwitterEngine가 reade 때까지 대기 스레드 X를 설정하려면?

답변

0

블록에 멀티 스레딩을 사용하지 않을 이유가 거의 없습니다. 그것들은 NSOperations보다 빨리 개발할 수 있고, 동기화는 더 간단하며 점프 스레드 (예 : UI 스레드 잡기)가 더 간단하고 내 경험상 성능이 더 좋습니다.

이 경우, 비동기 가져 오기를 실행하기 위해 새 스레드를 생성합니다 (각 비동기 가져 오기가 취소 가능성을 쉽게 만듭니다). 2 개의 동기화 블록을 대기열에 넣습니다. 인출은 처리 및 UI 업데이트를 위해 수행됩니다. 당신이 할 수있는 2 가지 방법이 있습니다 http://www.fieryrobot.com/blog/2010/06/27/a-simple-job-queue-with-grand-central-dispatch/

//GOES IN Tweet delegate 

myQueue = dispatch_queue_create("myQueue", 0);//local instance var dispatch_queue_t 

dispatch_async(myQueue, ^{ 

         [self processTweets];//executed after fetch is done. 
         dispatch_sync(dispatch_get_main_queue(), ^{ 
          [self uiBasedFunction];//executed on main thread 
                  }); 
         }); 
dispatch_release(myQueue); 
+0

답장을 보내 주셔서 감사합니다. 괜찮아 보이지만 MGTwitterEngine은 비동기 적으로 가져 오는 블록을 사용하지 않습니다. 나는 [twitterEngine getHomeTimelineSinceID : 등 ..]라고 부른다. 그 결과를 뮤 대리자로 반환합니다. 거기에 새로운 스레드가 생성됩니다. https://github.com/mattgemmell/MGTwitterEngine/blob/master/MGTwitterEngine.m 을 참조하십시오. 내 초기 가져 오기가 해고되고 블록이 [processTweets]와 (과) 즉시 진행될 것이라고 생각합니다. – jwdehaan

+0

확인 (내 편집 참조) –

0

: 여기에 좋은 혀입니다.

  1. 블로킹 네트워크를 사용하십시오.

  2. CFRunLoopRun()을 호출하면 스레드에서 작업이 진행될 때까지 다른 이벤트가 진행될 때까지 대기합니다. 비동기 데이터 가져 오기가 끝나면 스레드 x의 X runloops 컨텍스트에서 CFRunLoopStop()을 호출하십시오.