2011-01-18 13 views
5

Używam AsyncSocket na iPhone do komunikacji z serwerem. AsyncSocket jest oparty na pętlach uruchamiania, ale moja aplikacja jest oparta na wątkach. Oznacza to, że zaczynam nowy wątek do zapisu danych i czekam, aż otrzyma odpowiedź na ten sam wątek. Ale nie mogę wywołać metodę wykonania AsyncSocket bezpośrednio z innego wątku, muszę użyć:Używanie AsyncSocket z dodatkowymi wątkami na iPhonie

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

To nie praca, ale nie mogę uzyskać odpowiedzi z mojej metody „writeSomeData:” zwanego w ten sposób, ponieważ performSelectorOnMainThread zwrotów nic.

Metoda writeSomeData: robi coś takiego:

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

mogę dostać odpowiedź, korzystając z klasy zmiennej „dataReceived”, ale jego zawartość zmienia się w tym czasie.

Czy ktoś może mi powiedzieć, jak używać AsyncSocket (lub ogólnie, jak radzić sobie z klasami opartymi na pętli uruchamiania) na osobnych wątkach, tak, że jeśli wywołasz metodę tej klasy, to blokuje ona, dopóki metoda nie zostanie wykonana, a odpowiedź jest Odebrane?

Dziękuję.

+1

Dlaczego chcesz ten scenariusz w pierwszej kolejności? Po co tworzyć wątek, jeśli (pozornie) pierwszą rzeczą, którą robisz, jest blokowanie go, aż do jakiejś bardziej lub mniej arbitralnej daty przyszłej? Czemu by nie rozpocząć całego wątku od wątku z runloopem i wysłać dane _result-data_ do przetworzenia na 'NSOperationQueue' lub jednym z globalnych współbieżnych' dispatch_queue's? – danyowdee

Odpowiedz

-1

Spróbuj użyć GCD (Grand Central Dispatch), aby zapisać dane w oddzielnym wątku i wrócić do głównego wątku z chwilą zapisania danych. Można to zrobić tak:

// 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. 
    }); 
}); 

Mam nadzieję, że coś takiego może ci pomóc ...