0

내 응용 프로그램의 PubSub Client에있는 모든 가입 피드를 거치고 모든 항목을 읽음으로 표시하는 메소드가 내 Cocoa Mac 응용 프로그램에 있습니다. 읽지 않은 많은 수는 모두 순환에 시간이 걸릴 수 있습니다 피드가있는 경우 논리는 다음과 같이 보입니다NSInvocationOperation 질문

...

NSArray *feeds = [[PSClient applicationClient]feeds]; 

for(PSFeed *feed in feeds) 
{ 
    for(PSEntry *entry in [feed entries]) 
    { 
     entry.read = NO; 
    } 
} 

(상대적으로 말하기). 다른 것들은 백그라운드에서 진행되는 동안 사용자가 기사를 스크롤 같은 다른 일을 할 수있게하고 싶습니다. 그래서 루프가 실행되는 동안

NSInvocationOperation *opr = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(markAllReadOperation) object:nil]; 
[que addOperation:opr]; 
[opr release]; 

응용 프로그램이 여전히 심각한 성능 저하를 경험 ...과 같이 메서드를 호출하는 NSInvocationOperation 설정을 가지고있다. 그리고 UI는 거의 반응이 없습니다. NSInvocationOperation으로 무언가를 놓치고 있습니까? 아니면 내 논리가 본질적으로 느린 것입니까?

답변

0

이것은 ... Grand Central Dispatch! 당신이 당신의 UI 경우 OS X를

+0

거꾸로 지원하는 데 아무 문제가 없습니다. Mac App Store에 가져갈 계획입니다. 따라서 사용자는 기본적으로 10.6을 사용하게 될 것입니다. 이제는 NSInvocationOpeartion이 실패한 것을 어떻게 개선 할 것입니까? 나는 NSOperation이 더 높고 덜 복잡한 레이어에서 동일한 기능을 제공한다는 인상하에있었습니다. 업데이트 : 나는 이것을 시도했지만 작업이 별도의 스레드에서 실행되는 동안 나는 여전히 UI 응답이 부족합니다. – avizzini

+0

그건 이해가되지 않습니다 ... 나는 또한 어떤 호출이 블록을 일으키는 지 확인하기 위해 Instruments에서 프로파일 링을 권장합니다. –

+0

이전에 악기에서 프로파일 링을 사용하지 않았지만 정확히 무엇을 찾고 있습니까? 내가 알 수 있듯이 PubSub은 이벤트가 진행되는 동안 가장 높은 비율을 차지하고 있습니다. 심볼 이름을 탐색하는 동안 내 메소드는 "_dispatch_worker_thread2"에서 발생하고 "sendChangesSinceDate"(내 작업이 작동하는 동안 가장 높은 백분율을 차지함)와 같은 실제 PubSub 작업은 "Thread 0x5565 : Main Thread"에서 발생합니다. – avizzini

0

의 이전 버전을 지원해야하는 경우 그 사용하지 못할 수 있으므로 물론

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     [obj enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
      [obj setRead:NO]; 
     }]; 
    }]; 
}); 

, 그랜드 센트럴 디스패치 (차단)은 모두 맥 OS X 10.6에 소개되었습니다 응답이 없으면 주 스레드에서 실행중인 것처럼 들립니다. mainQueue을 사용하지 않으셨습니까?

나는 계기판을 사용하여 어떤 코드가 속도 저하의 원인인지 정확히 파악하기 위해 최선의 방법이라고 생각합니다.

+0

mainQueue를 사용하지 않고 새로운 NSOperationQueue 객체를 만듭니다. UI는 다소 반응하지만 상당한 지연이 있습니다. 주 스레드에서 진행하는 유일한 작업은 기본 UI 상호 작용이며 이는 뒤떨어져 있습니다. – avizzini