我正在从服务器加载数据并异步处理响应。使用NSURLConnection。对委托的每次调用,connection:didReceiveData:都在处理该块。
然而,就在收到一大块数据之前,我请求一个文本视图滚动到新行,即[textView scrollRangeToVisible:]。
问题是,在收到所有数据之前,textView通常不会滚动。这可能需要一段时间,并且会使UI看起来挂起。
为了解决这个问题,我认为主线程在处理数据时被锁定了,所以我应该把它分解成更小的块。
所以我改为代码来分解连接中接收到的数据:didReceiveData来执行较小的操作,并使用将它们排队
[self performSelectorOnMainThread:withObject:smallerChunk waitUntilDone:FALSE]
其想法是,它将一堆事件放在运行循环上,并尽可能地处理scrollRangeToVisible。
然而,这不起作用。至少不可靠。我错过了什么?
"然而,这不起作用。至少不可靠。"是一个相当模糊的错误描述。但是,我建议您在后台线程中处理从连接接收到的数据,这样它就不会阻塞主线程。
例如,您可以创建一个串行调度队列:
dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
并且在CCD_ 1中向该队列提交对数据的处理:
dispatch_async(myQueue, ^{
/* process data */
});