2009-07-17 5 views
10

저는 Objective-C를 처음 접했고 비 차단 방식으로 대기하는 방법을 알 수 없습니다. 비동기 적으로 채워지는 객체가 있는데 다른 메소드로 진행하기 전에 기다려야합니다. 지금은 절전 기능을 사용하고 있지만이 프로그램은 전체 응용 프로그램을 차단하고 myObject는로드되지 않습니다.Objective-C의 비 차단 대기 기능

while (!myObject) 
{ 
    sleep(1); 
} 
return myObject; 

EDIT :이 코드 스 니펫은 myObject가로드되기 전에 호출 될 수있는 메서드에서 가져온 것입니다. 이 경우 실제로이 메서드에서 차단하려고하지만 내 코드는 myObject를 비롯한 모든 항목이로드되는 것을 차단합니다.

+0

감사를했다, 나는이 질문을 발견하고 자신의 두 번째 코드를 사용하여 구현 : HTTP : //stackoverflow.com/questions/149646/best-way-to-make-nsrunloop-wait-for-a-flag-to-be-set –

답변

6

가능한 경우 해당 개체가로드 될 때 클래스에 myObjectLoaded: 메서드를 호출하도록 지정하십시오. 그렇지 않으면, 당신이 위에 쓴 것과 가장 관용적 인 점은 myObject를 계속 확인하고 일단 발견하면 타이머를 만드는 것입니다.

어떤 이유로 든 중간에 처리해야한다면 runloop을 계속 실행하는 루프를 만들어야합니다. 앱 실행을 방해하는 runloop이 부족합니다.

0

당신이 관찰자 패턴을 찾는 것처럼 들리 네요. Apple은 "notification"이라고 부릅니다.

+0

사실 내가 원하는 것이 아닙니다. 나는 통지 받고 싶지 않다. myObject가로드 될 때까지 * this * 스레드를 차단하고 싶지만 myObject는 myObject가 전혀로드되지 않도록 차단한다. –

0

당신은 어떤 배경 NSThread이 인구 작업을 수행해야 가정 할 때, 당신은 당신이 당신의 객체를로드 할 기다리고 메인 스레드를 중지하고 있기 때문에 년대 NSObject의 방법 performSelector:onThread:withObject:waitUntilDone

0

을 좋아 있습니다. 주 스레드는 UI를 구동하는 스레드이므로 사용자 입력을 대기하기 때문에 그렇게하지 마십시오. 주 스레드를 차단하면 응용 프로그램 사용자 인터페이스가 차단됩니다.

당신이 객체가로드 될 때 메인 스레드가 무언가를하고 싶은 경우에, 방법은 myObjectLoaded 작성 : 당신의로드 스레드에서 호출 : myObjectController 어떤 객체가 될 수 있습니다

[myObjectController performSelectorOnMainThread:@selector(myObjectLoaded:) 
            withObject:myObject 
            waitUntilDone:NO]; 

도 자신을 MyObject를.

3

NSNotification이 문제를 해결해야합니다. 대신 객체에 대기의

http://developer.apple.com/documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html

가 다른 개체에서 오는 통지를 대상 레지스터를 비동기 적으로 데이터를 채 웁니다하는 (발행인을 말한다). 이 Publisher 개체가 끝나면 NSNotification을 게시하고 대기중인 개체가 자동으로 선택합니다. 이것은 또한 기다리는 것을 제거 할 것입니다.

7

이 작은 복숭아 척의 대답에 .... (에 주문 20 초 동안 지연) 나를 위해

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false);