Запланируйте поток чтения в цикле выполнения - iOS - PullRequest
1 голос
/ 02 марта 2011

Я новичок в Какао / iOS - платформа iphone

Я пытаюсь работать с сетевыми потоками с использованием Core Foundations.Я следую руководству CFNetworking, но у меня не получается выполнить простой тест.Следующие компилируются и запускаются, но ничего не записывается в NSLog.

Я предоставляю Callback, clientCB, для CFReadStreamSetClient и планирую readStream в цикле выполнения (по крайней мере, это идея).Я ожидал, что CallBack сообщит что-то.

Может кто-нибудь сказать мне, где я иду не так?У меня есть telnet'd на этот сервер, и он работает.Любые предложения будут полезны.

Спасибо.

void clientCB(CFReadStreamRef stream, CFStreamEventType event, void *myPtr)
{
    switch(event) {
        case kCFStreamEventHasBytesAvailable:{
            UInt8 buf[BUFSIZE];
            CFIndex bytesRead = CFReadStreamRead(stream, buf, BUFSIZE);
            if (bytesRead > 0) {
              NSLog(@"Server has data to read!");
            }
            break;
        }
        case kCFStreamEventErrorOccurred:
            NSLog(@"A Read Stream Error Has Occurred!");
        case kCFStreamEventEndEncountered:
            NSLog(@"A Read Stream Event End!");
        default:
            break;
    }

}



- (IBAction) connectToServer: (id) sender

{
    CFReadStreamRef readStream; 
    CFWriteStreamRef writeStream;
    CFHostRef host = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)@"irc.freenode.net");
    CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, host, 6667, &readStream, &writeStream);

    CFStreamClientContext myContext = {
        0,
        self,
        (void *(*)(void *info))CFRetain,
        (void (*)(void *info))CFRelease,
        (CFStringRef (*)(void *info))CFCopyDescription
    };

    CFOptionFlags registeredEvents = kCFStreamEventHasBytesAvailable |
                                kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered;

    if(CFReadStreamSetClient(readStream, registeredEvents, clientCB, &myContext))
    {
        CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
    }

}

1 Ответ

1 голос
/ 02 марта 2011

Кажется, вы забыли вызвать CFReadStreamOpen.

    if(CFReadStreamSetClient(readStream, registeredEvents, clientCB, &myContext))
    {
        CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
    }

    if (!CFReadStreamOpen(readStream)) {
        /* error handling */
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...