1

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

4

1 回答 1

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 的文档在这里

于 2012-08-14T12:38:10.120 回答