有没有办法强制异步NSURLConnection在后台调用connectionDidFinishLoading?

时间:2014-03-19 15:19:51

标签: ios objective-c uitableview nsurlconnection

我在UITableView单元格内显示的背景中下载图像。

在UITableView停止滚动之前,

图像不会显示。

我想以更快的方式显示下载的图像。例如,我想在UITableView开始减速时这样做。

为此,我需要知道下载何时完成,在调用connectionDidFinishLoading之前我无法知道。在UITableView移动时不调用此方法。 (或者可能在界面繁忙时)

是否有可能以某种方式让它在UI忙碌时调用connectionDidFinishLoading,没有同步使用NSURLConnection?

2 个答案:

答案 0 :(得分:1)

这是你做的:

  • 让您的网络连接在Core Data中更新对象。
  • 在UITableView或Controller周围的某处设置NSFetchedResultsController,以查询该类型的对象,例如: images对象上的article集合。
  • 将UiTableView数据源绑定到NSFetchedResultsController - 即表的各个部分和行来自结果。

此时,表格视图应在滚动时成功显示任何旧/当前项目。现在,......

  • 当您的下载完成时(可能是与文章相关联的图像),以某种方式更新CoreData中的对象 - 例如只需将image插入名为articles的{​​{1}}上的集合中 - 结果控制器将根据您设置的初始谓词“看到”该内容。如果新对象的indexPath(article,image,等等)当前在tableView中可见,则tableView和结果控制器将为您散列它。

此时您应该完成,新图像可能会显示出来。结果控制器是KVO为您观察的。你需要采取行动,结果控制器得到改变,但有很多例子,如this(并且方法之间有很多差异)。如果没有,你可能需要做一些无害的事情 - 例如当新文章出现时滚动到顶部;除非你绝对必须,否则不要打电话给images

<强>更新

如果您只是尝试强制NSURLConnection同步或异步操作,那么您所要做的就是使用reloadData(或相关的初始化程序)和+ (NSURLConnection *)connectionWithRequest:(NSURLRequest *)request delegate:(id < NSURLConnectionDelegate >)delegate而不是{{1}来设置NSURLConnection }}。第一种方法是异步加载数据,而后者是同步的。

但是,既然你提到- (void)start,你似乎是异步设置连接,不是吗?

答案 1 :(得分:0)

在后台运行同步NSURLConnection的一种简单方法是使用GCD。

dispatch_async(dispatch_get_global_queue(0,0),^                    {

                  // Do your synchronous NSURLConnection and handle the response


                        dispatch_async(dispatch_get_main_queue(), ^{

                          // update UI  

                        });
                 });

您还可以使用SDWebImage来很好地处理图像加载。 https://github.com/rs/SDWebImage