2014-03-28 4 views
-2

iOS 및 Objective C 프로그래밍을 시작할 때 코드가 동 기적으로 실행되지 않는 문제가 발생합니다.메서드가 다른 스레드에서 실행 중입니다.

다음 코드는 내 ViewController.m 파일에 있습니다.

[[self classInstance] instanceMethod]; 
//more code here executes at the same time as instanceMethod 

내 instanceMethod와 코드는 동시에 실행되지만 이후 코드는 실행중인 instanceMethod에 의존합니다. 처음에는 별도의 스레드에 넣으려고했는데 일단 완료된 후에 코드를 실행했지만 어떤 instanceMethod도 절대로 기다리지 않아도 보인다.

나는 그것이 작동시킬 수 있었던 유일한 방법은 일을하는 것입니다 :

[[self classInstance] instanceMethod]; 
while(self.classInstance.instanceVariable == nil){ 
    // wait for other code to fill the variables I need 
    // do nothing 
} 
// execute remaining code 

나는 다음 시도했지만이 예상대로 작동하지 않습니다.

dispatch_async(backgroundQueue, ^{ 
    [[self classInstance] instanceMethod]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     //other code here for once instanceMethod is completed. 
    });  
}); 

나는 내가 아직 이해할 수없는 기본적인 것을 놓치고 있다고 느낍니다.

+3

이 'instanceMethod'의 기능은 무엇입니까? 그것의 코드를 보여라. – rmaddy

+0

메서드의 코드는 단순하고 변수를 사용자 기본값으로 채 웁니다. 코드는 사용 된 사용자 기본값 뒤에 있지만 채워지는 것을 기다리지 않았습니다. 코드를 로깅으로 대체하고 동일한 동작을 감지했습니다. 문제는 클래스 인스턴스 메소드가 자체 스레드로 디스패치되는 이유와 실행이 끝난 후 다음 코드가 실행되도록하는 방법에 관한 것입니다. 메서드의 코드는 모든 코드가 비헤이비어를 복제하기 때문에 질문과 관련이 없습니다. – user3473745

답변

1

그것은 instanceMethod에 완료 블록을 추가하는 것이 해결책 :

- (void)instanceMethodWithCompletion:(void (^)(void))completion { 
    // Do something... 

    if(completion) { 
     completion(); 
    } 
} 

는 그것은 instanceMethod가 완료하고 실행되었음을 알 수 있습니다 :

[[self classInstance] instanceMethodWithCompletion:^{ 
    // Handle finish of the instance method 
}]; 

을 그리고이 같은 instanceMethod 선언 블록 내의 다른 코드.

+0

감사합니다. 이것은 완벽하게 작동합니다. 왜 내가 스레드를 만들고 dispatch_sync로 두 개의 블록을 디스패치하면 그 스레드에서 순서대로 실행되지 않는가? 아니면 정확히 무엇이 일어나고 있는지를 보여줄 수있는 자료를 알고있을 것입니다. – user3473745

+0

'instanceMethod'가 비동기 작업을 시작한다고 생각하지 않습니까? 이것이 문제의 원인 일 수 있습니다. –

+0

당신의 질문에 좀 더 정확히 답하기 위해서'instanceMethod'가 무엇인지 알아야합니다. –

관련 문제