【问题标题】: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?

【问题讨论】:

    标签: ios objective-c uitableview 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多