2011-01-18 11 views
5

Uso AsyncSocket sull'iPhone per comunicare con un server. AsyncSocket è basato su cicli di esecuzione ma la mia app si basa sui thread. Ciò significa che avvio una nuova discussione per scrivere i dati e attendo fino a quando una risposta non viene ricevuta sullo stesso thread. Ma non posso chiamare il metodo di un AsyncSocket direttamente da un altro thread, devo usare:Utilizzo di AsyncSocket con thread secondari su iPhone

[self performSelectorOnMainThread:@selector(writeSomeData:) withObject:dataToWrite waitUntilDone:YES]; 

funziona, ma non riesco a ottenere la risposta dal mio metodo "writeSomeData:" chiamato in questo modo, perché i rendimenti performSelectorOnMainThread Niente.

Il metodo writeSomeData: fa qualcosa di simile:

-(NSData *)writeData:(NSData *)dataToWrite { 
    dataReceived = nil; // AsyncSocket writes data to this variable 
    [asyncSocket writeData:dataToWrite withTimeout:-1 tag:0]; 
    [asyncSocket readDataToData:[@"<EOF" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; 
    int counter = 0; 
    while (dataReceived == nil && counter < 5) { 
     // runLoop is [NSRunLoop currentRunloop] 
     [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.3]]; 
     ++counter; 
    } 

    return [dataReceived copy]; 
} 

ho potuto ottenere la risposta accedendo alla variabile di classe "DataReceived", ma il suo contenuto è cambiato in questo momento.

Qualcuno può dirmi come utilizzare AsyncSocket (o in generale, come gestire le classi basate su run-loop) su thread separati, in modo che se chiamo un metodo di quella classe blocchi finché il metodo non viene eseguito e una risposta è ricevuto?

Grazie.

+1

perché si vuole che lo scenario in primo luogo? Perché creare una discussione se la prima cosa che apparentemente è che la blocca fino ad una data futura più arbitraria o meno arbitraria? Perché non iniziare tutto dal thread con il runloop e inviare _result-data_ per l'elaborazione su un 'NSOperationQueue' o uno dei' dispatch_queue's globali concorrenti? – danyowdee

risposta

-1

Provare a utilizzare GCD (Grand Central Dispatch) per scrivere i dati su un thread separato e poi tornare al thread principale nel momento in cui i dati sono stati scritti. Si potrebbe fare così:

// call this on the main thread 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    NSData *data = [self writeData:dataToWrite]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // do something with the data on the main thread. 
    }); 
}); 

Spero che qualcosa di simile può aiutare ...