在特定单元格上显示UIActivityIndi​​catorView

时间:2016-11-09 17:08:00

标签: ios objective-c multithreading uitableview

以下是情景:

  • OrderVC有一个表格视图,如果你向右滑动就会显示一些 选项。其中一个选项是Checkout
  • 当用户点击Checkout时,它会打开CheckoutVC,其中包含父类OrderVC
  • 此处用户可以添加一些文本并可以附加多个图像,也可以将此数据保存为使用核心数据实现的草稿。但是,当用户提交帐单时,我使用AFNetworking来调用网络API并使用AFMultipartFormData上传图片。所有这一过程都是在后台主题上进行的,即dispatch_async
  • 我无法更新dispatch_get_main_queue中的用户界面,因为方法正在调用其他方法,请参阅this question,明确这一点。因此它在第一个方法完成后立即调用更新UI。


问题
只要后台线程正在运行,它就应该在单元格上显示活动指示符。当它完成并且CheckoutVC中的响应成功时,它应该重新加载OrderVC的tableView。

解决方案我尝试了
我尝试在for中运行allOrderID循环,这是我通过的ID web api命中活跃订单。然后我拨打了MR_findFirstByAttribute来查找草稿中是否存在任何提取的OrderIDisSending实体中有一个属性DraftOrderInfo,它是一个BOOL,当结帐进入后台线程时,我将其归为真。因此,如果isSending为真,我会显示活动指示符来代替我创建的UIView。

for (NSString *orderID in allOrderId) {
       DraftOrderInfo *dpi = [DraftOrderInfo MR_findFirstByAttribute:@"orderID" withValue:orderID];

       if (dpi.isSending) {
           orderCell.rightUtilityButtons = nil;

           activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
           activityView.center = CGPointMake(orderCell.orderStatusIndicatorBadgeView.frame.origin.x-2, orderCell.orderStatusIndicatorBadgeView.frame.origin.y-8);

           [activityView startAnimating];

           [orderCell.orderStatusIndicatorBadgeView addSubview:activityView];
       }
   }

我得到的输出是,当加载OrderVC时,它开始在所有单元格上显示活动指示符。

1 个答案:

答案 0 :(得分:1)

首先,您的以下几点无效。阅读有关问题的评论:

  

无法更新dispatch_get_main_queue中的UI,因为方法正在调用   从内部的其他方法看到这个问题,它清楚这一点。所以   它在第一个方法完成后立即调用更新UI。

回到问题所在。有许多好的做法可供使用。其中之一:

  1. 在设计时将UIActivityIndicator添加到UITableViewCell(笔尖或故事板),与UILabel和其他控件一样。

  2. 提交结帐时。将isSending状态更改为YES,并通过调用UIViewController上的reloadData方法通知父UITableView重新加载表数据。

  3. cellForRowAtIndexPathwillDisplay:forRowAt方法中,根据isSending值将活动指示符的状态设置为动画或停止。这样,即使重新加载表格或上下滚动,活动指示器也会处于正确的状态。

  4. 提交完成后。将isSending状态更改为YES,并通过调用reloadData上的UITableView方法通知您的父ViewController重新加载表。并且由于签入在后台线程中完成,您应该使用dispatch_get_main_queue通知您的父ViewController。阅读您添加到问题中的问题的评论。关于dispatch_get_main_queue是错误的,你提到这一点。