CFReadStreamClientCallBack в фоновом потоке - PullRequest
0 голосов
/ 05 февраля 2012

В моем приложении я открываю сервер по WiFi для обмена файлами и загрузки файлов из веб-браузера в приложение. У меня проблема в том, что он работает в основном потоке (потоке пользовательского интерфейса) и создает много проблем, есть способ заставить этот код работать в фоновом режиме?

Это код:

Я делаю поток чтения неблокирующим с помощью этого метода:

if (!CFReadStreamSetClient (theReadStream,
    kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered | kCFStreamEventOpenCompleted,
    (CFReadStreamClientCallBack)&MyCFReadStreamCallback,
    (CFStreamClientContext *)(&theContext) ))
{
    NSError *err = [self getStreamError];

    NSLog (@"AsyncSocket %p couldn't attach read stream to run-loop,", self);
    NSLog (@"Error: %@", err);

    if (errPtr) *errPtr = err;
    return NO;
}

и он вызывает этот метод:

    static void MyCFReadStreamCallback (CFReadStreamRef stream, CFStreamEventType type, void *pInfo)
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        AsyncSocket *socket = [[(AsyncSocket *)pInfo retain] autorelease];
        [socket doCFReadStreamCallback:type forStream:stream];

        [pool release];
    }

это исходный код, который я использую: http://code.google.com/p/cocoaasyncsocket/

1 Ответ

1 голос
/ 05 февраля 2012

Просто создайте фоновый поток с кодом, подобным следующему:

bgThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadMain) object:nil];
[bgThread start];

и запустите слушатель сервера с помощью метода threadMain.

Узнайте больше о многопоточности в Программирование потоковРуководство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...