2011-10-31 41 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); 

我的發車方法是這樣的:

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]; 

我得到回調的委託方法之一,其中I信號旗語

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

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

}

但是,當我在信號量上發送等待時,不調用委託方法。 它只有被稱爲當我註釋掉

//dispatch_semaphore_signal(mSem); 

任何幫助將不勝感激。

回答

4

如果你從主線程調用[reader start]那麼你正在創建一個死鎖。您的流正與此處的主線程關聯:

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

這意味着它的工作主循環必須旋轉。如果dispatch_semaphore_wait位於主線程上,則會停止運行循環並阻止該流處理其事件。

我不知道如何評論出dispatch_semaphore_signal會做任何事情,除了使wait永遠不會返回。