一个多线程的函数,由:
[NSThread detachNewThreadSelector:@selecter(download:) toTarget:..... withObject:....];在内部调用回调函数。在多线程之前,回调机制工作得很好,但现在回调函数永远不会被调用。
我已经检查了线程函数是否正常工作。
以下是代码,非常感谢。
+(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];
}发布于 2016-03-04 01:31:21
重要的编辑:我下面的回答是不正确的,它实际上没有在另一个线程中创建和运行读取流!实际上,它似乎只是调度读取流在主线程中找到的run循环上运行。
在新线程上获得循环后,
if(CFReadStreamSetClient(readStream,events,readStreamEventCallBack,& dataStreamContext)) { CFReadStreamScheduleWithRunLoop(readStream,CFRunLoopGetCurrent(),kCFRunLoopCommonModes);CFRunLoopRun();}
是正确的代码!如果您希望在主线程中的循环上运行代码,请仅执行以下操作。
我发现您需要调用CFRunLoopGetMain()而不是CFRunLoopGetCurrent()
if(CFReadStreamSetClient(readStream, events, readStreamEventCallBack, & dataStreamContext)) {
CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetMain(), kCFRunLoopCommonModes);}将是在您的情况下调用的正确代码
发布于 2011-07-18 19:40:44
请检查readStream是否已打开
if (CFReadStreamOpen((CFReadStreamRef)readStream)) {
NSLog(@"CFReadStreamOpen Sucessfully");
}
else {
NSLog(@"Unable to start HTTP connection");
}如果是打开的,尝试注释NSAutoReleasePool我认为在ReadStream打开之前一些请求值是自动释放的。
谢谢,
发布于 2011-07-20 00:47:31
它现在起作用了。
这很奇怪。回调不会被触发。相反,我可以在ReadStream打开后从原始函数中读取数据。
https://stackoverflow.com/questions/6693422
复制相似问题