Използвам AsyncSocket на iPhone, за да комуникирам със сървър. AsyncSocket е базиран на цикли за изпълнение, но моето приложение е базирано на нишки. Това означава, че започвам нова нишка за запис на данни и чакам, докато се получи отговор в същата нишка. Но не мога да извикам метод на AsyncSocket директно от друга нишка, трябва да използвам:
[self performSelectorOnMainThread:@selector(writeSomeData:) withObject:dataToWrite waitUntilDone:YES];
Работи, но не мога да получа отговор от моя метод "writeSomeData:", наречен по този начин, защото performSelectorOnMainThread не връща нищо.
Методът 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 (или като цяло, как да се справя с класове, базирани на цикъл на изпълнение) на отделни нишки, така че ако извикам метод от този клас, той да блокира, докато методът не бъде изпълнен и не бъде получен отговор?
Благодаря ти.
NSOperationQueue
или един от глобалните едновременниdispatch_queue
s? - person danyowdee   schedule 01.01.2012