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ę.
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