我正在使用NSInputStream从网上抓取一些资源:
CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), (__bridge CFURLRef)url, kCFHTTPVersion1_1);
CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
CFRelease(request);
_inputStream = CFBridgingRelease(readStream);
_inputStream.delegate = self;
[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[_inputStream open];
然后将实际工作卸载到其他线程:
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
NSLog(@"stream: %@ handleEvent: %d", aStream, eventCode);
dispatch_async(_custom_serial_queue, ^{
switch(eventCode) {
case NSStreamEventOpenCompleted: {
NSLog(@"Stream has opened");
break;
}
// rest of switch
});
}
我看到 Stream已打开日志,然后在95%的情况下我的主线程冻结
这只发生在iPhone4和iOS6.1上,在iPhone5s和iOS7以及iPad3 iOS6.1上一切都很好。
请问您能否说明此代码有什么问题。
编辑1:我已经使用__sync_add_and_fetch
函数跟踪了一些代码(在第三方库中)的问题。它似乎导致了问题,但我仍然需要使用它。
编辑2:我已将__sync_add_and_fetch
功能更改为OSAtomicAdd32
,但它没有改变任何内容。
编辑3:我已在其他设备上检查过问题。适用于iPhone4s iOS7,iPad2 iOS6.1。看来这个问题只与1个核心设备有关。