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 사용을 이해하지 못함

  1. 세마포어 토큰을 설정합니다.
  2. dispatch_async 개체를 초기화하는 블록입니다.
  3. 신호가 생성되면 새 인스턴스를 반환 할 수 있습니다. 당신이 초기화 거기 논리로 끝까지 경우 외부 정상적인 흐름이나 새 스레드 또는 아무것도에 간다 아무것도, 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; 

} 

감사

+0

Object의 init 메소드가 주 스레드가 아닌 다른 스레드에서 실행되도록 강요하는 것 외에는 실제로 많은 것을 지적하지 않습니다. 블록의 끝 부분에서 신호가있을 때까지 호출 스레드가 차단 될 것이라고 말한 것처럼이 훅을 통해 점프하는 것은 실제로 이점이없는 것처럼 보입니다. –

+0

나는 다른 모든 것들이 평등하다는 것에 동의 할 것이다. 두 번째 패턴을 사용할 것이다. 하지만 나는'initWithAttribute'가 최종 판단을 내리기 전에 무엇을하는지보고 싶습니다. 이 메서드는 심각한 코드 냄새가 있습니다. 그리고이'objectWithAttribute' 구현은 코드를 제거하기 전에 코드의 다른 근본적인 문제를 해결하려는 시도가 실패하지 않았 음을 확인하고자합니다. 원저자는 아마도 어떤 이유로 자신을 왜곡했기 때문에 그 이유를 알아낼 수 있는지 알아 봅시다. 종종 이런 이상한 것을 보게되면 더 큰 문제의 증상이됩니다. – Rob

+0

속성의 출처는 어디입니까? 초기화가 진행되는 동안 변경하지 않으려는 메모리 위치에 있습니까? initWithAttribute가 초기화 프로세스 중에 일정하게 유지해야하는 호출 객체 (속성을 통해 참조되었을 수 있음)의 일부에 액세스하는 경우 이는 이유 일 수 있습니다. –

답변

0

그 배경 큐에 세마포어와 dispatch_async의 사용을 완전히 무의미한 것 같다 : 제 질문은 내가 함께 위의 방법을 대체 할 수없는 이유, 이것이다. 그것은 당신이해야한다고 생각하는 것이어야합니다.

호출되는 코드가 이미 비동기 호출 인 경우 세마포어를 사용하는 것이 좋습니다. 그러나 alloc/init을 배경으로 강제 할 이유는 없었습니다.