首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程中的CFReadStream :从未调用过的回调

多线程中的CFReadStream :从未调用过的回调
EN

Stack Overflow用户
提问于 2011-07-14 20:51:28
回答 3查看 1K关注 0票数 0

一个多线程的函数,由:

代码语言:javascript
复制
[NSThread detachNewThreadSelector:@selecter(download:) toTarget:..... withObject:....];

在内部调用回调函数。在多线程之前,回调机制工作得很好,但现在回调函数永远不会被调用。

我已经检查了线程函数是否正常工作。

以下是代码,非常感谢。

代码语言:javascript
复制
+(void) download:(id) param{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  

    while(true){
        NSLog(@"Thread going ");
        NSArray* ary = [Data_Center sharedData_Center]->data;

        for(int i = 0; i < [ary count]; i++) {
            NSLog(@"code = %@", code);
            ..........            
            NSURL* url1 = [NSURL URLWithString:str_code];

            [str_code length];


            CFStreamClientContext dataStreamContext = {0, self, NULL, NULL, NULL};

            CFHTTPMessageRef message = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), (CFURLRef)url1, kCFHTTPVersion1_1);
            CFHTTPMessageSetBody(message, (CFDataRef)(CFSTR("")));

            CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, message);
            CFOptionFlags events = kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered;

            // print "client = 1" here                    
            //NSLog(@"client = %d" , CFReadStreamSetClient(readStream, events, readStreamEventCallBack, & dataStreamContext));


            if(CFReadStreamSetClient(readStream, events, readStreamEventCallBack, & dataStreamContext)) {
                CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
            }


            CFReadStreamOpen(readStream);
        }


        [NSThread sleepForTimeInterval:10];
    }
    [pool release];

}
EN

回答 3

Stack Overflow用户

发布于 2016-03-04 01:31:21

重要的编辑:我下面的回答是不正确的,它实际上没有在另一个线程中创建和运行读取流!实际上,它似乎只是调度读取流在主线程中找到的run循环上运行。

在新线程上获得循环后,

  1. 调用CFRunLoopGetCurrent()
  2. call CFRunLoopRun()

if(CFReadStreamSetClient(readStream,events,readStreamEventCallBack,& dataStreamContext)) { CFReadStreamScheduleWithRunLoop(readStream,CFRunLoopGetCurrent(),kCFRunLoopCommonModes);CFRunLoopRun();}

是正确的代码!如果您希望在主线程中的循环上运行代码,请仅执行以下操作。

我发现您需要调用CFRunLoopGetMain()而不是CFRunLoopGetCurrent()

代码语言:javascript
复制
 if(CFReadStreamSetClient(readStream, events, readStreamEventCallBack, & dataStreamContext)) {
     CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetMain(), kCFRunLoopCommonModes);}

将是在您的情况下调用的正确代码

票数 1
EN

Stack Overflow用户

发布于 2011-07-18 19:40:44

请检查readStream是否已打开

代码语言:javascript
复制
if (CFReadStreamOpen((CFReadStreamRef)readStream)) {
    NSLog(@"CFReadStreamOpen Sucessfully");
}
else {
    NSLog(@"Unable to start HTTP connection");
}

如果是打开的,尝试注释NSAutoReleasePool我认为在ReadStream打开之前一些请求值是自动释放的。

谢谢,

票数 0
EN

Stack Overflow用户

发布于 2011-07-20 00:47:31

它现在起作用了。

这很奇怪。回调不会被触发。相反,我可以在ReadStream打开后从原始函数中读取数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6693422

复制
相关文章

相似问题

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