Я использую AsyncSocket на iPhone для связи с сервером.AsyncSocket основан на циклах выполнения, но мое приложение основано на потоках.Это означает, что я запускаю новый поток для записи данных и жду, пока ответ не будет получен в том же потоке.Но я не могу вызвать метод AsyncSocket напрямую из другого потока, я должен использовать:
[self performSelectorOnMainThread:@selector(writeSomeData:) withObject:dataToWrite waitUntilDone:YES];
Это работает, но я не могу получить ответ от моего метода writeSomeData:, вызванного таким образом, потому чтоexecuteSelectorOnMainThread ничего не возвращает.
Метод writeSomeData: делает что-то вроде этого:
-(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];
}
Я мог бы получить ответ, обратившись к переменной класса "dataReceived", но его содержимое в это время изменяется.
Может кто-нибудь сказать мне, как использовать AsyncSocket (или вообще, как обращаться с классами на основе цикла выполнения) в отдельных потоках, так что если я вызываю метод этого класса, он блокируется, пока метод не будет выполнен иответ получен?
Спасибо.