해야 할 일 : 전역 변수를 피하기 위해 배열이 포함 된 Singleton 클래스가 있습니다. 이 배열은 두 개의 다른 스레드에 의해 액세스됩니다 :
- 1) 첫 번째 스레드는 주 스레드이며이 NSMutableArray에 때때로 객체를 추가해야합니다.
- 2) 다른 스레드가 (루핑 TRUE 동안) 내가 무슨 짓을했는지 지금까지) 뭔가가 포함되어있는 경우 내 생각이었다공유 메모리가 "뮤텍스"이고 iPhone의 NSCondition이
) (배열을 비우려고 (하고 내 싱글 톤 클래스 을, 나는이 내 NSMutableArray (list
) 및 NSCondition (conditionLock
)입니다.
무엇 내 메인 스레드가하고있는 것은 :
[[sharedSingleton conditionLock] lock];
[[sharedSingleton list] addObject:obj];
[[sharedSingleton conditionLock] signal];
[[sharedSingleton conditionLock] unlock];
는 내가 거기에 물건을 올려하려고 할 때 비어하지 않도록 객체를 차단하려는. (공유 메모리 보호). 객체가 배열에 배치되면 다른 스레드에 신호를 보냅니다. 내가 올바르게 이해했다면, 이것은 세마포어처럼 카운터를 늘리는 것과 같습니다. 신호는 다른 스레드에게 "객체가 있습니다."라고 말합니다. 두 번째 스레드가하고있는 무엇
:
while (YES) {
[[sharedRequest conditionLock] lock];
[[sharedRequest conditionLock] wait];
RequestLauncher * req = [[RequestLauncher alloc] initWithGenericsObject:[[sharedRequest list] objectAtIndex:0]];
[req performSelectorOnMainThread:@selector(Launch)
withObject: nil
waitUntilDone:YES];
[[sharedRequest list] removeObjectAtIndex:0];
[[sharedRequest conditionLock] unlock];
}
그래서 난 내 문제는 내가 잠금 및 다음 신호를 기다리 있지만, 모든 애플의 예는 순서대로 점이다 같아요. 이 코드는 주 스레드에서 하나의 개체를 추가 할 때 작동하는 것 같습니다. 그러나 둘 이상을 추가하려는 경우 잠금 주위에서 차단됩니다.
편집 나는 다른 무언가를 시도했지만 동작이 예상 아니었다 : 이것처럼
, 나는 mainThread 개체를 추가 할 수 있었다 그래서 그 NSMutableArray의 잠금을 해제했다.
while (YES) {
[[sharedRequest conditionLock] lock];
[[sharedRequest conditionLock] wait];
GenericsObject * obj = [[sharedRequest list] objectAtIndex:0];
[[sharedRequest list] removeObjectAtIndex:0];
[[sharedRequest conditionLock] unlock];
RequestLauncher * req = [[RequestLauncher alloc] initWithGenericsObject:obj];
[req performSelectorOnMainThread:@selector(Launch) withObject: nil waitUntilDone:YES];
}
안녕하세요, 단지 관측, 삶의 유일한 목적은 주 스레드에서 선택기를 호출하고 일종의 일을 끝낼 때까지 기다리는 두 번째 스레드를 갖는 목적을 패배시키는 두 번째 스레드가 있습니다. – idz
당신은 절대적으로 옳습니다. 그래서 지금은 NSOperation을 사용합니다.방금 메인 스레드에서 비동기 NSURLConnection을 실행하는 데 문제가있었습니다. – Pierre