2011-08-13 7 views
2

私は、各スレッドが何らかの仕事をしなければならないマルチスレッドアプリケーションを持っていますが、ある時点では、sqlite3ので、私はそのコードを呼んでいるデータベースが)使用して、メインスレッドで実行される:メインスレッド以外のアプリケーションライフタイムスレッドの使用

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

をし、すべてのものは、そのコードがアプリケーションとユーザーとの対話は、そのコードまで無効になりますいくつかの時間を必要とするときことを除いて、うまく行きましたバックグラウンドで実行できるもう1つのスレッドを作成する方法はありますか?メインスレッドと同じように必要なときに呼び出すことができるので、前の呼び出しを次のように置き換えることができます。

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

このスレッドは、すべてのコードからアクセスするいくつかのクラスの静的データメンバーである必要があります。

非常に高く評価されるだろう任意のヘルプ、および事前に多くのおかげで...

答えて

0

私の質問のために、データベースジョブが終了するまで現在のスレッドをブロックする必要があるため私はこれらの2つのソリューションを試してみて、完全に機能しました。あなたは、クリティカルセクションやNSOperationQueueを使用することができますどちらかと私は最初のものを好む、ここではそれらの両方のためのコードは次のとおりです。

は「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... 
    } 
} 

ORあなたが使用することができます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]を使用して実行ループだ実行してみましょう、行うことは非常に簡単です。 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. 
}); 

、キューを解放することを忘れないでください:

+0

あなたの答えに感謝しますが、このコードは現在のスレッドが完了するためにDBに書き込むコードを待つようにしますか?私はwaitUntilDoneを使ってこの問題を解決しました。もう一度感謝します – Mousa

関連する問題