2011-01-18 1 views
5

Я использую AsyncSocket на iPhone для связи с сервером. AsyncSocket основан на циклах запуска, но мое приложение основано на потоках. Это означает, что я запускаю новый поток для записи данных и жду, пока в одном потоке не будет получен ответ. Но я не могу назвать метод давал AsyncSocket непосредственно из другого потока, я должен использовать:Использование AsyncSocket со вторичными потоками на iPhone

[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 (или вообще как обращаться с классами, основанными на циклах), в отдельных потоках, так что, если я вызываю метод этого класса, он блокирует до тех пор, пока метод не будет выполнен, и ответ будет получено?

спасибо.

+1

Почему вы хотите, чтобы сценарий в первую очередь? Зачем создавать поток, если (по-видимому) первое, что вы делаете, это блокировать его до тех пор, пока не появится какая-то еще менее условная будущая дата? Почему бы не начать все это из потока с помощью runloop и отправить _result-data_ для обработки на «NSOperationQueue» или один из глобальных параллельных 'dispatch_queue'? – danyowdee

ответ

-1

Попробуйте использовать GCD (Grand Central Dispatch), чтобы написать свои данные в отдельном потоке, а затем вернуться к основной теме в тот момент, когда были записаны данные. Вы можете сделать это следующим образом:

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

Я надеюсь, что-то, как это может помочь вам ...