Ios 处理异步NSURLConnection接收数据时图形挂起

Ios 处理异步NSURLConnection接收数据时图形挂起,ios,drawing,nsurlconnection,nsthread,nsurlconnectiondelegate,Ios,Drawing,Nsurlconnection,Nsthread,Nsurlconnectiondelegate,我正在从服务器加载数据并异步处理响应。使用NSURLConnection。对委托connection:didReceiveData:的每次调用都在处理该块 然而,就在收到一大块数据之前,我请求一个文本视图滚动到一个新行,即[textView scrollRangeToVisible:] 问题是,在收到所有数据之前,textView通常不会滚动。这可能需要一段时间,使UI看起来挂起 为了解决这个问题,我认为主线程处理数据时被锁定了,所以我应该把它分成更小的块 所以我改为代码来分解连接中接收到的数据

我正在从服务器加载数据并异步处理响应。使用NSURLConnection。对委托connection:didReceiveData:的每次调用都在处理该块

然而,就在收到一大块数据之前,我请求一个文本视图滚动到一个新行,即[textView scrollRangeToVisible:]

问题是,在收到所有数据之前,textView通常不会滚动。这可能需要一段时间,使UI看起来挂起

为了解决这个问题,我认为主线程处理数据时被锁定了,所以我应该把它分成更小的块

所以我改为代码来分解连接中接收到的数据:didReceiveData执行较小的操作,并使用

[self performSelectorOnMainThread:withObject:smallerChunk waitUntilDone:FALSE]
其思想是,它将一系列事件放在runloop上,并尽可能处理scrollRangeToVisible


然而,这是行不通的。至少不可靠。 我遗漏了什么?

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

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

dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
连接中:didReceiveData:
将数据处理提交到该队列:

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

至少不可靠地说,这意味着有时它确实可以滚动文本视图,但通常是在处理数据的末尾或接近末尾时。它太慢了,没有用。我试过你的方法,效果很好。我担心的是,我正在用接收到的数据填充一个核心数据数据库,并担心从后台线程访问它。但是,在此过程中,没有任何其他线程进行访问,因此可能是安全的。我记不起核心数据限制是指MOC一次只能在一个线程上使用,还是仅在一个线程周期内使用。@David:我很高兴听到我的建议对您有所帮助。(别忘了接受答案。)-对于如何在不同的线程上使用MOC,确实存在很大的限制。你会在这里找到很多关于这个话题的帖子。如果你需要更多的帮助,我建议你开始一个新的问题,因为这是一个完全不同的主题。