ios - thread - swift4 싱글톤




왜 Apple은 ARC에서 singleton 패턴을 구현하기 위해 dispatch_once를 사용하도록 권장합니까? (2)

ARC에서 싱글 톤의 공유 인스턴스 접근 자에서 dispatch_once를 사용하는 정확한 이유는 무엇입니까?

+ (MyClass *)sharedInstance
{
    //  Static local predicate must be initialized to 0
    static MyClass *sharedInstance = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MyClass alloc] init];
        // Do any other initialisation stuff here
    });
    return sharedInstance;
}

백그라운드에서 비동기 적으로 싱글 톤을 인스턴스화하는 것은 나쁜 생각이 아닌가? 내가 공유 인스턴스를 요청하고 즉시 의존한다면 어떻게 될까?하지만 dispatch_once는 크리스마스까지 내 객체를 생성하는 데 걸리는가? 그것은 바로 바로 돌아 오지 않습니까? 적어도 그것은 그랜드 센트럴 디스패치의 요점 인 것 같습니다.

그런데 왜이 일을하고 있습니까?


그것은 한 번만 실행되기 때문입니다. 따라서 다른 스레드에서 두 번 액세스하려고하면 문제가 발생하지 않습니다.

Mike Ash는 Singletons 블로그 게시물에 대한 Care and Feeding에 대한 자세한 설명을 제공합니다.

모든 GCD 블록이 비동기 적으로 실행되는 것은 아닙니다.


dispatch_once() 는 절대적으로 동기식입니다. 모든 GCD 메소드가 일을 비동기 적으로 처리하는 것은 아닙니다 (대소 문자를 구별하면 dispatch_sync() 가 동기식입니다). dispatch_once() 를 사용하면 다음 관용구가 대체됩니다.

+ (MyClass *)sharedInstance {
    static MyClass *sharedInstance;
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [[MyClass alloc] init];
        }
    }
    return sharedInstance;
}

이것보다 dispatch_once() 의 이점은 더 빠르다는 것입니다. 그것은 또한 의미 론적으로 더 깨끗합니다. 왜냐하면 sharedInstance의 alloc init을 수행하는 여러 스레드에서 여러분을 보호하기 때문입니다 - 모두 똑같은 시간에 시도한다면 말입니다. 두 개의 인스턴스를 만들 수 없습니다. dispatch_once() 의 전체 아이디어는 "한 번만 수행하십시오"라는 것인데, 정확히 우리가하는 일입니다.





automatic-ref-counting