繁体   English   中英

使用NSURLConnection进行异步调用后处理数据的更好方法是什么?

[英]What is a better way to deal with data after an async call using NSURLConnection?

这是我用于使用NSURLConnection填充表视图的当前逻辑。 这对我来说似乎并不优雅。

Table View Controller的viewDidLoad方法使用URL字符串作为参数在我的api包装器类中调用“sendConnection”方法。 这个方法使NSURLConnection。 在connectionDidFinishLoading(在我的包装类中),另一个方法被调用(也在包装类中),连接作为参数。 此方法从连接对象中提取URL并检查它。 然后它使用switch语句根据URL处理数据。 数据存储在包装类本身的变量中。 调用cellForRowAtIndexPath时,异步调用已完成,数据已处理完毕。

有没有更好的方法呢?

我问这个的原因如下:我想刷新一个具有新高度的单元格和单击它时的新文本标签。 在点击单元格时,将从服务器检索此文本标签的数据。 每个单元格在标签中的数据略有不同(每个单元格代表一个“用户”,标签将显示您与用户有多少共同的朋友)。 我想在检索数据时将数据存储在单元格中,然后将其放入文本标签中。 对于我目前的URL调用方式,这似乎是不可能的。

任何帮助如何实现这一点将不胜感激。

这是我喜欢在这些情况下使用的模式的一些伪代码。 也许它也会对你有所帮助。

- (void)viewDidLoad {
     //1. put up some type of progressHud or spinner
     //2. call your NSURL wrapper
     //3. in the completion block of your wrapper, set your datasource variables
          //example: @property (nonatomic,strong) NSArray *listOfData;
     //4. create a custom setter for your datasource that calls tableview reload
     //5. enable a refresh function; like "pull to refresh" or a bar button
     //6. when pull to refresh is tapped or called, just repeat these steps


}
- (void)setListOfData:(NSArray*)listOfData {

       _listOfData = listOfData;
       if (_listOfData) {
           [self.tableView reloadData];
       }
}

当我再次阅读你的问题时,还有一些想法:上面的模式适用于你的初始加载,创建人或朋友的列表等。

如果您计划在敲击单元格后进行另一次往返,则必须考虑许多问题。 这类似于将图像延迟加载到tableview单元格中的常见问题。 有一些问题需要考虑滚动 - 如果在数据返回之前单元格从视图滚动,例如,如果单元格已被重用,如果单元格不再与该单元格相关联,该怎么办?

Github上有许多异步图像库,可以很好地查看它们如何解决这些问题。 通常,他们跟踪单元格中的项目,然后检查单元格是否仍在视图中,如果是,则设置图像。

您有类似的问题需要解决。 点击单元格,获取新数据,然后更新单元格。 调整单元格大小将需要您重新加载它。

使用RowAnimation查看[tableview reloadRowsAtIndexPaths:(NSArray *):( UITableViewRowAnimation)];

希望有助于祝福;

您应该有一个“数据模型”,它表示表视图的内容(即单元格)。

由于表视图中有“行”,因此该数据模型是一种数组(可能是NSArray ),其元素保持单元格的数据和状态

每个单元格的数据不仅应该在您的单元格中呈现所有“数据”属性(例如标签),还应该具有其状态

当用户选中单元格时,它将启动异步任务。 此任务可能需要一段时间才能完成,因为它从远程服务器获取数据。 想想几秒钟,甚至更长时间。 您需要跟踪挂起的更新任务,因为您的实现应该阻止用户在相应的挂起更新任务完成之前再次更新单元。

有几种技术可以实现这一目标。 一种方法是在“Cell Data”类中拥有一个反映此状态的属性,例如:

@interface CellModel : NSObject    
@property (atomic) BOOL hasPendingUpdate;
...

在渲染单元格时,您将检索属性的值并适当地渲染单元格。

更新任务完成后,它会更新其单元模型数据。

模型更新最终将更新您的表视图。 有几种技术可以实现这一目标。 您应该注意此处的线程安全以及数据模型和表格视图单元格的“同步”。 例如,确保hasPendingUpdate的值仅在主线程上发生更改 - 否则您的渲染单元格可能与数据模型不同步(更不用说竞争条件,以防您在没有同步原语的情况下修改和访问不同线程上的属性) 。

当单元格等待更新时,它应该直观地指示此状态(例如,使用微调器)并禁用该操作以启动更新任务。

非常推荐使用“取消”按钮,该按钮取消某个单元更新任务或所有挂起的更新任务。

当用户离开此视图时,您可以考虑取消所有挂起的任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM