2011-08-13 3 views
2

각 스레드가 어떤 작업을 수행해야하는 멀티 스레딩 응용 프로그램이 있지만 특정 시점에 일부 코드가 연속적으로 실행되어야합니다 (예 : sqlite3 그래서 그 코드를 호출하고있어 데이터베이스)를 사용하여 주 스레드에서 수행되는 :기본 스레드 이외의 application-lifetime-thread 사용

[self performSelectorOnMainThread:@selector(serialJob:) withObject:object waitUntilDone:YES]; 

을 모든 것은 그 코드는 응용 프로그램과 사용자의 상호 작용이 그 코드까지 비활성화됩니다 시간을 필요로 할 때 점을 제외하고 잘 갔다 완료되었으므로 배경에서 실행될 수있는 다른 하나의 스레드를 만들 수있는 방법이 있으며 기본 호출과 같이 필요할 때마다 호출 할 수 있으므로 이전 호출을 다음과 같이 바꿀 수 있습니다.

[self performSelector:@selector(serialJob:) onThread:REQUIRED_THREAD withObject:object waitUntilDone:YES]; 

이 스레드는 코드 전체에서 액세스 할 수있는 클래스의 정적 데이터 멤버 여야합니다.

어떤 도움은 매우 감사하고, 사전에 많은 감사 할 것 ...

이 할 매우 쉽습니다

답변

0

내 질문으로 인해 데이터베이스 작업이 완료 될 때까지 현재 스레드를 차단해야합니다. , 나는이 두 가지 해결책을 시도했으며 완벽하게 작동했습니다.

하는 몇 가지 클래스 "DatabaseController"를 정의하고 구현 코드를 추가합니다 :

static NSString * DatabaseLock = nil; 
+ (void)initialize { 
    [super initialize]; 
    DatabaseLock = [[NSString alloc] initWithString:@"Database-Lock"]; 
} 
+ (NSString *)databaseLock { 
    return DatabaseLock; 
} 

- (void)writeToDatabase1 { 
    @synchronized ([DatabaseController databaseLock]) { 
     // Code that writes to an sqlite3 database goes here... 
    } 
} 
- (void)writeToDatabase2 { 
    @synchronized ([DatabaseController databaseLock]) { 
     // Code that writes to an sqlite3 database goes here... 
    } 
} 

또는 당신은 중요한 부분 또는 NSOperationQueue를 사용할 수 있습니다 내가 첫 번째를 선호, 여기의 모두에 대한 코드는 NSOperationQueue를 사용하려면 사용할 수 있습니다

static NSOperationQueue * DatabaseQueue = nil; 
+ (void)initialize { 
    [super initialize]; 

    DatabaseQueue = [[NSOperationQueue alloc] init]; 
    [DatabaseQueue setMaxConcurrentOperationCount:1]; 
} 
+ (NSOperationQueue *)databaseQueue { 
    return DatabaseQueue; 
} 

- (void)writeToDatabase { 
    NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(FUNCTION_THAT_WRITES_TO_DATABASE) object:nil]; 
    [operation setQueuePriority:NSOperationQueuePriorityHigh]; 
    [[DatabaseController databaseQueue] addOperations:[NSArray arrayWithObject:operation] waitUntilFinished:YES]; 
    [operation release]; 
} 

이 두 솔루션은 현재 스레드를 차단 데이터베이스에 기록이 당신이 대부분의 경우에 고려할 수있는 완료 될 때까지.

2

, 당신의 스레드를 생성하고 그것이 [[NSRunLoop currentRunLoop] run]을 사용하여 runloop의 실행하자. performSelector:onThread:을 사용자 지정 스레드와 함께 사용하는 데 필요한 모든 것입니다.

iOS 4 이상을 사용하는 경우 스레드 대신 Grand Central Dispatch 대기열을 사용해보십시오. GCD API는 사용하기가 훨씬 쉬우 며 시스템 리소스를 훨씬 효과적으로 활용할 수 있습니다.

+0

이 스레드를 만드는 방법에 대한 샘플 코드 (applicationDelegate라고 가정 해 봅시다)를 작성하고 평생 동안 얼마나 많은 작업을 수행했는지에 관계없이 응용 프로그램의 수명 동안 실행되도록 초기화 할 수 있습니까? 이 스레드는 애플리케이션로드가 완료되면 생성되어야하며 닫힐 때 제거되어야합니다. – Mousa

1

스벤이 언급 한 것처럼 Grand Central Dispatch을 살펴보십시오. 이제

dispatch_queue_t myQueue = dispatch_queue_create("com.yourcompany.myDataQueue", NULL); 

해당 큐에 블록을 호출 할 수 있습니다 :

이 완료
dispatch_async(myQueue, ^{ 
    // Your code to write to DB. 
}); 

, 큐를 해제하는 것을 잊지 마세요을

이 같은 큐를 만들 수 있습니다 :

dispatch_release(myQueue); 
+0

답해 주셔서 감사합니다.하지만이 코드는 현재 스레드가 DB에 쓰는 코드가 끝날 때까지 기다릴 수있게합니까? 내가 질문에 언급 한대로 waitUntilDone을 ​​YES로 설정하여이 작업을 수행했습니다. 고마워요. – Mousa