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