首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在run循环上调度读取流- iOS

在run循环上调度读取流- iOS
EN

Stack Overflow用户
提问于 2011-03-02 13:44:55
回答 1查看 2.3K关注 0票数 1

我刚接触Cocoa/iOS - iphone平台

我正在尝试使用Core Foundation来处理网络流。我正在遵循CFNetworking指南,但是我不能让一个简单的测试工作。以下代码会编译并运行,但不会记录到NSLog中。

我将回调clientCB提供给CFReadStreamSetClient,并在run循环中调度readStream (至少这是这样的想法)。

我还以为CallBack会报告些什么呢。

有没有人能告诉我哪里出错了?我已经telnet到这台服务器上了,它工作正常。任何建议都会很有帮助。

谢谢。

代码语言:javascript
复制
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);
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-02 15:31:50

你好像忘了给CFReadStreamOpen打电话了。

代码语言:javascript
复制
    if(CFReadStreamSetClient(readStream, registeredEvents, clientCB, &myContext))
    {
        CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
    }

    if (!CFReadStreamOpen(readStream)) {
        /* error handling */
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5163863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档