2013-02-21 5 views
4

방금 ​​NSOperation/NSOprationQueue를 사용하기 시작 했으므로이 질문에 대해 용서해주십시오. : PNSOperationQueue 작업 내에서 새 스레드와 동시 작업

내 응용 프로그램의 시작 부분에 큐에서 수행 할 기능 집합을 원한다. 그래서 한 끝에서 다른 시작될 때 (한 번에 하나의 작업 만 발생하도록 setMaxConcurrentOperationCount을 1로 설정했습니다.). 모든 것은 정보의 서버에 다운로드/업로드의 일종으로 백그라운드에서 일어나야합니다.

다른 작업을 수행하기 위해 새로운 스레드를 호출 할 수있는 다른 메서드를 호출하는 첫 번째 작업을 큐에 넣습니다.

내 질문은 작업 대기열은 두 번째 작업을 시작하기 전에 첫 번째 작업에서 시작된 모든 메서드/스레드가 완료 될 때까지 기다릴 것입니까?

답변

1

NSOperation에는 동시 및 비 동시의 두 가지 종류가 있습니다.

비 동시 작업은 -main 메서드에서 구현되며이 메서드가 반환되면 작업이 완료된 것으로 간주됩니다. -main 안에 스레드를 생성하고 스레드가 완료 될 때까지 작업을 실행하려면 스레드가 완료 될 때까지 -main에서 실행을 차단해야합니다 (예 : 세마포어 사용).

동시 작업에는 -isExecuting-isFinished과 같은 조건 자 집합이 있으며 작업을 시작하는 방법은 -start입니다. 이 메소드는 백그라운드 처리를 생성하고 즉시 반환 할 수 있습니다. -isFinished이 그렇게 말하기 전까지는 전체 작업이 완료된 것으로 간주되지 않습니다.

이제는 GCD를 사용 했으므로 NSOperation 대신 블록 및 디스패치 대기열을 사용하는 것이 좋으며 NSOperationQueue에있는 –addOperationWithBlock: 방법을 참조하십시오.

0

NSOperation이 [NSURLConnection sendAsynchronousRequest : .....]와 같은 비동기 작업을 수행하는 경우 작업이 실행되는 스레드가 응답을 기다리지 않고 기다리지 않습니다. 메인 메소드의 마지막 명령문이나 블록의 마지막 명령문이 실행되면 곧바로 명령이 큐에서 제거되고 다음 작업이 시작됩니다.

0

NSOperationQueue *queue=[NSOperationQueue new]; 
[queue setMaxConcurrentOperationCount:1]; 
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{ 
    //operation first 
}]; 
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{ 
    //operation second 
}]; 
[blockOperation2 addDependency:blockOperation1]; 
[queue addOperation:blockOperation1]; 
[queue addOperation:blockOperation2]; 
같은 것을 사용할 수 있습니다