有啥方法可以强制异步 NSURLConnection 在后台调用 connectionDidFinishLoading 吗?

Posted

技术标签:

【中文标题】有啥方法可以强制异步 NSURLConnection 在后台调用 connectionDidFinishLoading 吗?【英文标题】:Is there any way to force async NSURLConnection to call connectionDidFinishLoading in the background?有什么方法可以强制异步 NSURLConnection 在后台调用 connectionDidFinishLoading 吗? 【发布时间】:2014-03-19 15:19:51 【问题描述】:

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

在 UITableView 停止滚动之前不会显示图像。

我想以更快的方式显示下载的图像。例如,我想在 UITableView 开始减速时执行此操作。

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

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

【问题讨论】:

【参考方案1】:

这就是你要做的:

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

此时,表格视图应该会在您滚动时成功显示所有旧的/当前的项目。现在,...

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

此时您实际上应该已经完成​​了,新图像可能刚刚出现。结果控制器是 KVO 为您观察。您确实需要对结果控制器进行更改来采取行动,但是那里有很多示例,例如this(并且方法之间存在很大差异)。如果没有,您可能需要做一些无害的事情 - 例如。当新文章出现时滚动到顶部;除非万不得已,否则避免致电reloadData

更新

如果您只是想强制 NSURLConnection 同步或异步操作,那么您所要做的就是使用 + (NSURLConnection *)connectionWithRequest:(NSURLRequest *)request delegate:(id < NSURLConnectionDelegate >)delegate(或相关的初始化程序)和 - (void)start 而不是 + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error 设置 NSURLConnection。第一种方法是异步加载数据,而后者是同步的。

不过,既然你提到了connectionDidFinishLoading,看来你是在异步建立连接,不是吗?

【讨论】:

感谢您的演练,但是,这仍然不能直接或间接地帮助我解决这个问题:难道没有办法代替同步使用 NSURLConnection 吗?【参考方案2】:

让同步的 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

【讨论】:

以上是关于有啥方法可以强制异步 NSURLConnection 在后台调用 connectionDidFinishLoading 吗?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以强制在 iOS13 的入职过程中出现“始终允许”提示?

有啥方法可以强制重置 App Engine 上的所有缓存静态文件?

有啥方法可以强制 C++ 中进程的 WorkingSet 为 1GB?

有啥方法可以强制在 spring-security 中的某些页面使用 https 吗?

当列不明确时,有啥方法可以强制 Mysql 在 where 子句中使用 select 中的列?

有啥方法可以使用旧的 .net 框架版本异步写入 FileStream 吗?