2011-10-31 3 views
2

J'utilise dispatch_semaphore_wait pour arrêter mon thread actuel mais il semble qu'il arrête tous mes threads.dispatch_semaphore_wait arrête TOUS les threads dans l'application iPhone

code:

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

[reader start]; 

dispatch_semaphore_wait(reader->mSem, DISPATCH_TIME_FOREVER); 

Ma méthode de démarrage a quelque chose comme:

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

Je reçois le rappel dans l'une des méthodes de délégués dans laquelle je signale la sémaphores

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

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

}

Toutefois, lorsque j'envoie wait sur le sémaphore, la méthode delegate n'est pas appelée. Son appelé seulement quand je commente la ligne

//dispatch_semaphore_signal(mSem); 

Toute aide sera grandement appréciée.

Répondre

4

Si vous appelez [reader start] à partir de votre tâche principale, vous créez un interblocage. Votre flux est associé au fil principal ici:

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

Cela signifie que pour que cela fonctionne, la boucle principale doit tourner. Si le dispatch_semaphore_wait se trouve sur le thread principal, vous arrêtez la boucle d'exécution et empêchez le flux de gérer ses événements.

Je ne vois pas comment commentant le dispatch_semaphore_signal ferait n'importe quoi d'autre faire le wait ne reviendra jamais.

Questions connexes