Използване на AsyncSocket с вторични нишки на iPhone

Използвам 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 (или като цяло, как да се справя с класове, базирани на цикъл на изпълнение) на отделни нишки, така че ако извикам метод от този клас, той да блокира, докато методът не бъде изпълнен и не бъде получен отговор?

Благодаря ти.


person Arthur    schedule 18.01.2011    source източник
comment
Защо бихте искали този сценарий на първо място? Защо да създавате нишка, ако (привидно) първото нещо, което правите, е да я блокирате до някаква по-или по-малко произволна бъдеща дата? Защо не започнете цялото нещо от нишката с runloop и не изпратите резултатните данни за обработка на NSOperationQueue или един от глобалните едновременни dispatch_queues?   -  person danyowdee    schedule 01.01.2012


Отговори (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.
    });
});

Надявам се, че нещо подобно може да ви помогне...

person Mihai Fratu    schedule 03.02.2012