处理异步时挂起的绘图NSURLConnection接收数据

问题描述:

我正在从服务器加载数据并异步处理响应。使用NSURLConnection。每次调用委托,连接:didReceiveData:正在处理该块。然而,在收到一大块数据之前,我要求一个文本视图滚动到一个新行,即[textView scrollRangeToVisible:]。处理异步时挂起的绘图NSURLConnection接收数据

问题是,经常,textView不滚动,直到所有的数据已被收到。这可能会持续一段时间,并且会使用户界面看起来很大

为了试图解决这个问题,我想主线程已经锁定处理数据,所以我应该把它分解成更小的块。

所以我改变了代码打破了在连接接收的数据:didReceiveData进行小规模的行动,并排队起来使用

[self performSelectorOnMainThread:withObject:smallerChunk waitUntilDone:FALSE] 

的思维是它把一束事件对runloop和会尽可能地处理scrollRangeToVisible。

但是,这是行不通的。至少不可靠。 我错过了什么?

“但是这不起作用,至少不可靠。”是一个非常模糊的错误描述。但是,我建议你在后台线程中处理从连接接收到的数据,这样它就不会阻塞主线程。

例如,您可以创建一个串行调度队列:

dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL); 

connection:didReceiveData:提交的数据的处理,该队列:

dispatch_async(myQueue, ^{ 
    /* process data */ 
}); 
+0

至少不可靠的意思,有时它得到滚动文本视图,但通常在处理数据的末端或接近结束处。它如此缓慢,没有用处。我试过你的方法,它的工作。我担心的是我用接收到的数据填充核心数据数据库,并担心从后台线程访问它。但是,在这个过程中没有任何其他线程可以访问,所以它可能是安全的。我不记得是否核心数据限制是MOC只能在一个线程上一次使用,或者只能在一个线程周期内使用。 – David

+0

@David:我很高兴听到我的建议对你有帮助。 (不要忘记接受答案。) - 对于如何在不同线程上使用MOC的确存在很大的限制。您会在这里找到关于该主题的大量帖子。如果您需要更多帮助,我会建议您提出一个新问题,因为这是一个完全不同的主题。 –