2011-10-27 18 views
5

내 머리카락을 찢어 내면 어떤 생각이나 제안이라도 대단히 감사하겠습니다.performSelectorOnMainThread가 실행되지 않습니다.

자식 스레드에서 performSelectorOnMainThread:withObject:waitUntilDone:을 호출하는 개체가 있습니다. 이것은 95 %의 시간 동안 잘 동작합니다. 때때로 iOS 베타 버전부터 출시 될 때마다 기기가 performSelectorOnMainThread:withObject:waitUntilDone: 호출을 거부합니다. 오류 메시지가 나타나지 않고 오류가 발생하지 않으며 기기가 실패한 상태가 될 수 없습니다. "일단 앱이 삭제되면 앱을 삭제하고 다시 설치하거나 앱을 강제 종료 한 다음 강제로 위치 서비스 허용 한도를 조정 한 다음 다시 실행하고 다시 위치 서비스를 정상적으로 다시 조정할 때까지 계속 실패합니다. .. 장치를 다시 시작해도 문제가 해결되지 않습니다. 먼저 삭제하지 않고 재설치해도 문제가 해결되지 않습니다. 매우 이상합니다. 대부분의 장치에는 문제가 없기 때문에 대부분의 경우 작동하지만 일부 장치는 다소 정기적으로 (매 3 ~ 4 일마다) 실패합니다. 그게 구체적으로 그 performSelectorOnMainThread:withObject:waitUntilDone: 내가 지금 실패한 장치를 가지고 있기 때문에 무엇을해야 호출 아니에요, 그리고 NSLog를 호출해야합니다 메서드에 넣었습니다 알아요. 괜찮아요,하지만 실패한 장치에서 performSelectorOnMainThread:withObject:waitUntilDone:을 사용하여 NSLog에서 해당 메서드를 호출하면 실행되지 않는 것으로 나타납니다. ...

이것은 iOS 5 베타 버전에서 발생하기 시작하고 다시 릴리스됩니다. 2 대의 기기에서 가장 자주 발생하지만 개인적으로 테스트 한 다른 10 대의 기기에서는 발생하지 않습니다. 나는 그것이 베타의 일부 딸꾹질에서 내 장치라고 가정했지만, 베타 버전에 전혀 영향을주지 않는 내 새로운 4S와 한 사용자의 iPad 2 (내 iPad 2가 아님)에서 발생합니다.

나는 어디에서보아야할지 정말로 모른다. 나는 그것을 실행하고 그것은 거의 모든 장치에서 일반적으로하지만, 같은 라인은 어떤 응답 및 아무런 오류가 등등에 도착하지 않습니다 ...

+0

입니까 혹시 CoreData를 사용하고 계신가요? 나는 비슷한 문제가 있었다. 실제로 일어난 일은 다른 스레드가 쓰려고 시도하는 동안 CoreData를 사용하여 읽기 작업을 수행하기 위해 대기하는 스레드 교착 상태였습니다. – picciano

+0

@picciano 어떻게이 문제를 해결 했습니까? 나는 같은 문제가 발생하고 교착 상태를 해결하기 위해 내가해야 할 일이 무엇인지 알 수 없다. –

답변

3

performSelectorOnMainThread : withObject : waitUntilDone 때로는 워키 수 있습니다. lib 디스패치를 ​​사용하려고 생각한 적이 있습니까?

당신은 블록을 생성하고이 같은 메인 스레드에 게시 할 수 있습니다

dispatch_async(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 

이 같은 영향을 막아 것이다 http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

0

스레드의 RunLoop가 여러 가지 다른 모드 performSelectorOnMainThread:withObject:waitUntilDone 를 사용한다. 이 시간 동안 메인 쓰레드가 performSelectorOnMainThread:withObject:WaitUntilDone: 대상이 하나입니다 기본 하나 (다른 모드에서 실행되는 전화를 만드는 것이 가능하다.

performSelectorOnMainThread:withObject:waitUntilDone:modes:
Apple's documentation를 참조하십시오 사용하는 것이 좋습니다.

또한 - GCD (libdispatch)는 굉장하지만, 자신에게 교착 상태를 요리에서 당신을 보호 할 것입니다 : 당신의 방법은 주 스레드에서 실행되는 경우를 고려 당신이 전화하는거야 :

dispatch_sync(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 
관련 문제