2011-10-31 10 views
2

私は現在のスレッドを停止するためにdispatch_semaphore_waitを使用していますが、すべてのスレッドを停止しているようです。dispatch_semaphore_waitはiPhone APP内のすべてのスレッドを停止します

コード:

SampleReader *reader = [[SampleReader alloc] initWithHostname:hostname andFilePath:filepath]; 
reader.endHandler = endHandler; 

[reader start]; 

dispatch_semaphore_wait(reader->mSem, DISPATCH_TIME_FOREVER); 

マイstartメソッドのようなものがあります:私はセマフォ

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{ 

    switch (eventCode) 
    Case NSStreamEventErrorOccurred: 
        dispatch_semaphore_signal(mSem); 
     break; 
    case NSStreamEventEndEncountered: 
     dispatch_semaphore_signal(mSem); 
     break; 

}

を知らせる前記デリゲートメソッドのいずれかでコールバックを取得

mFileStream = [[NSOutputStream outputStreamToFileAtPath:[fileurl path] append:FALSE] retain]; 
[mFileStream open]; 

mNetworkStream = (NSInputStream *)CFReadStreamCreateWithFTPURL(NULL, (CFURLRef)ftpurl); 
mNetworkStream.delegate = self; 
[mNetworkStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 
[mNetworkStream open]; 

しかし、セマフォーで待機を送信すると、デリゲートメソッドは呼び出されません。 その、私はすべてのヘルプは大歓迎されます

//dispatch_semaphore_signal(mSem); 

行をコメントアウトするときにのみ呼び出されます。

答えて

4

メインスレッドから[reader start]に電話している場合、デッドロックが発生しています。あなたのストリームはここのメインスレッドに関連付けられています:

[mNetworkStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 

これは、メインループループがスピンしている必要があることを意味します。しかし、dispatch_semaphore_waitがメインスレッドにある場合は、実行ループを停止し、ストリームがそのイベントを処理しないようにします。

dispatch_semaphore_signalのコメントアウト方法以外に何もしないとわかりません。waitは返されません。

関連する問題