寻求有关iOS中线程性能影响的建议

时间:2012-08-14 12:27:34

标签: ios multithreading performance cocoa

我一直在研究一个JSON解析器https://github.com/nathanday/ndjson,它解析一个字节流而不是一个完整的文档,并直接转换为CoreData实体或自定义对象,而不是通常的属性列表对象。我接近版本1.0,但我已经到了正确支持NSURLConnection连接并使解析压缩JSON字节流更容易的点我必须改变我的解析内部工作的方式,以便可以重复调用它(使用NSData对象NSURLConnectionDelegate didReceiveData:方法例如)。 我有两个选择,我能想到,最简单的是使用一个线程等待下一个可用的数据,或者我可以重写我的代码的解析部分,以便可以反复调用它,从哪里拾取它最后是为需要在调用之间维护的变量创建自己的赌注。 使用线程是最简单的,因为它不需要很少的重写(如果有的话),但由于这应该是一般用途的库,我担心在像iPhone这样的资源受限设备上创建比需要更多的线程。因为其他选项会使代码更复杂,并且不得不维护我自己的堆栈。 有没有人有任何好的建议或者其他可能的选择。创建线程是否昂贵。也许有人可以想到使用块的创造性方式,或者是否可以调用NSRunLoop对象来执行下一个事件(NSURLConnectionDelegate方法)。

1 个答案:

答案 0 :(得分:1)

在iOS和OS X下,Apple提供了一种无需头痛的好方法:Grand Central Dispatch。线程并不昂贵,系统负责为您创建线程。

您可以使用串行队列来处理数据,然后使用块在主线程上同步它:

// create the queue that will process your data:
dispatch_queue_t dataProcessQueue = dispatch_queue_create("data process queue", NULL); // the name is there for debugging purposes
    //dispatch to the newly created queue, and do not wait for it to complete
    dispatch_async(dataProcessQueue, ^{
        //your asynchronous job
        dispatch_async(dispatch_get_main_queue(), ^{
            // the work that has to be done on your main thread using data from above
    });
});
// don't forget to release the queue
dispatch_release(dataProcessQueue);

如果您需要进行并发工作,则应使用并发队列。

Apple的文档是here