2012-08-16 5 views
1

J'essaie d'utiliser sleep dans le code ci-dessous lorsque la connexion NSStream échoue ou s'il y a une erreur de flux et tente de se reconnecter après le sommeil. Le sommeil fonctionne, mais il met l'application entière à dormir.Sleep for NSThread

J'ai démarré NSStream en tant que thread, mais lorsque le NSStreamEvent est reçu, handleEvent semble fonctionner comme une méthode synchrone.

Des idées sur l'utilisation de sommeil pour cette pièce de code ..? Je veux juste que le sommeil fonctionne pour le fil de discussion seul.

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)event 
{ 
     case NSStreamEventErrorOccurred: 
     { 
      NSError *streamErr = [stream streamError]; 
      NSString *strErr = [streamErr localizedFailureReason]; 
      [self CloseStream]; 
      NSLog(@"Stream Error ::: %@",strErr); 
      //[NSThread sleepForTimeInterval : 15]; 
      sleep(15); 
      [self Initialize]; 
      [self OpenStream]; 
      break; 
     } 

     case NSStreamEventEndEncountered: 
     { 
      NSLog(@"Connection Closed by the Server"); 
      [self CloseStream]; 
      usleep(15000); 
      [self Initialize]; 
      [self OpenStream]; 
      break; 
     } 
} 

Répondre

1

Vous devez utiliser GCD (Grand Central Dispatch). Votre code est en cours d'exécution en arrière-plan et votre application ne gèle pas.

Lire ceci: GCD Reference

Fondamentalement, vous créez une file d'attente et ajoutez un bloc de code, qui est en cours d'exécution en arrière-plan. Voici mon exemple de code

dispatch_queue_t backgroundQueue = dispatch_queue_create("some_identifier", NULL); 
dispatch_async(backgroundQueue, ^(void) { 
     //do your background stuff 

     dispatch_sync(dispatch_get_main_queue(), ^{ 
      //update the gui (if needed) 
     }); 

    }); 
+1

Ne pas oublier dispatch_release :) – jjxtra