在iOS6中打开流后,NSInputStream会冻结应用程序

时间:2014-04-25 07:55:12

标签: ios multithreading networking grand-central-dispatch nsstream

我正在使用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%的情况下我的主线程冻结

Screenshot of call stack of main thread

这只发生在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个核心设备有关。

0 个答案:

没有答案