有啥方法可以强制异步 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 以查询该类型的对象,例如images
在 article
对象上的集合。
将 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 吗?