2011-08-08 3 views
0

스레드가 시작된 시나리오에서 부모 스레드의 메서드에 여전히 액세스 할 수 있습니까? 이 메서드를 호출하는 특정 방법이 있습니까? 그렇다면 무엇입니까?객관적인 관점에서 멀티 스레드는 어떻게 작동합니까?

참고 : 내 시나리오에서 두 스레드는 데이터 조작을위한 것이며, 인터페이스 관련 스레드가 아닙니다. (이것은 .NET에서 고려해야 할 것으로 알고 있으며, Objective-c에 있다는 것을 모릅니다.)

답변

1

정의에 의한 스레드는 상위 스레드의 상태를 공유합니다. 당신은 작업자 스레드를 생성 할 경우 오브젝티브 -c에서 & 메인 스레드에 대한 몇 가지 방법을 호출 할이이 경우 소위

[self performSelectorOnMainThread:@selector(someMethod:) withObject:nil waitUntilDone:NO];

4

같이 수행 할 수 있습니다, 그것은 그랜드 센트럴 디스패치를 ​​사용하는 (GCD) 최고입니다 NSThead 또는 NSOperation을 직접 사용하는 대신 동시성의

개요 : http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008091

소개 그랜드 센트럴 파견 :

dispatch_queue_t backgroundQueue = dispatch_queue_create("com.example.exampleQueue", 0); 

dispatch_async(backgroundQueue, ^{ 

    // operate on data in the background here 
    NSData *stuff = [self doSomethingComplex]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
    // Perform Task back in the main thread 
     [viewController updateStuff:stuff]; 
    }); 
}); 

이 : 귀하의 예제와 http://cocoasamurai.blogspot.com/2009/09/guide-to-blocks-grand-central-dispatch.html

, 당신은이 기능을 달성하기 위해 그랜드 센트럴 파견에 중첩 호출을 사용할 수 있습니다 방법은 이러한 종류의 작업을 수행하는 데 선호되는 방법입니다. 또한 블록을 활용함으로써 클래스 내에서 여러 메소드를 예제로 작성하지 않고도 코드를 쉽게 이해할 수 있습니다.

1

인터페이스 항목이 아니거나 호출 할 수있는 인터페이스 요소가있는 경우 @syschronise(obj) 또는 NSLock과 같이 모든 언어에서 수행해야하는 일반적인 스레드 안전 작업을 수행 할 수 있습니다. 하지만 인터페이스 물건이 될 물건이라면 'Srikar'가 큐에 효과적으로 메시지를 배치 할 [self performSelectorOnMainThread:@selector(setDataCount:) withObject:count waitUntilDone:NO];이라고 썼습니다.

관련 문제