0
+(instancetype) objectWithAttribute:(NSString *)attribute {
__block id newInstance;
dispatch_semaphore_t s = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
newInstance = [[Object alloc] initWithAttribute:attribute];
dispatch_semaphore_signal(s);
});
dispatch_semaphore_wait(s, DISPATCH_TIME_FOREVER);
return newInstance;
}
그래서이 코드 블록을 발견했습니다. 필자는 일반적으로 세마포어와 동시성에 대해 매우 제한적으로 이해하고 있습니다. 하지만 나에게이 코드는 :초기화에서 semaphone 사용을 이해하지 못함
- 세마포어 토큰을 설정합니다.
- dispatch_async 개체를 초기화하는 블록입니다.
- 신호가 생성되면 새 인스턴스를 반환 할 수 있습니다. 당신이 초기화 거기 논리로 끝까지 경우 외부 정상적인 흐름이나 새 스레드 또는 아무것도에 간다 아무것도, Intangible Order of Execution (dispatch_semaphore_t, dispatch_group_async) and the Use of Them in Combination with Different Dispatch Queue Types
:
는 여기 표시된 답을 읽는에서이 결론에 도달.
+(instancetype) objectWithAttribute:(NSString *)attribute {
id newInstance = [[Object alloc] initWithAttribute:attribute];
return newInstance;
}
감사
Object의 init 메소드가 주 스레드가 아닌 다른 스레드에서 실행되도록 강요하는 것 외에는 실제로 많은 것을 지적하지 않습니다. 블록의 끝 부분에서 신호가있을 때까지 호출 스레드가 차단 될 것이라고 말한 것처럼이 훅을 통해 점프하는 것은 실제로 이점이없는 것처럼 보입니다. –
나는 다른 모든 것들이 평등하다는 것에 동의 할 것이다. 두 번째 패턴을 사용할 것이다. 하지만 나는'initWithAttribute'가 최종 판단을 내리기 전에 무엇을하는지보고 싶습니다. 이 메서드는 심각한 코드 냄새가 있습니다. 그리고이'objectWithAttribute' 구현은 코드를 제거하기 전에 코드의 다른 근본적인 문제를 해결하려는 시도가 실패하지 않았 음을 확인하고자합니다. 원저자는 아마도 어떤 이유로 자신을 왜곡했기 때문에 그 이유를 알아낼 수 있는지 알아 봅시다. 종종 이런 이상한 것을 보게되면 더 큰 문제의 증상이됩니다. – Rob
속성의 출처는 어디입니까? 초기화가 진행되는 동안 변경하지 않으려는 메모리 위치에 있습니까? initWithAttribute가 초기화 프로세스 중에 일정하게 유지해야하는 호출 객체 (속성을 통해 참조되었을 수 있음)의 일부에 액세스하는 경우 이는 이유 일 수 있습니다. –