1

我正在使用一个有很多工作循环的应用程序。循环生成一串数字,然后将它们放入UITableView。当工作正在进行时,我想显示一个UIActivityIndicatorView。我将活动指示器添加到屏幕并居中。起初,我没有得到活动指标。我意识到这是因为活动指示符与循环在同一线程上运行,并且循环运行时该指示符永远不会更新。我做了一些关于如何创建后台线程的研究,并提出了这个问题。带循环的活动指示器

self.progressIndicator.startAnimating() 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {() -> Void in 
     for var instance = 0; instance < numberCount!; instance++ { 
      //Lots of work done in here. Items are added to a 
      //collection that is used to populate the table view. 
      //Takes around 10 seconds to execute. 
     } 
     NSNotificationCenter.defaultCenter().postNotificationName("FinishedNumbers", object: nil) 
    }); 

活动指示器正在主线程上运行,并且循环的处理在后台运行。我创建了一个通告程序,用于调用函数来调用reloadList,并在数字列表完成后停止活动指示符。

func doneWithCreateNumbers(notification: NSNotification) { 
    self.numberList.reloadData() 
    self.progressIndicator.stopAnimating() 
} 

虽然这确实奏效,但它不能正常工作。有几个问题。

尽管循环的处理在10秒内完成,但需要更长的时间来填充列表并且活动指示器停止旋转。我在doneWithCreateNumbers函数中放置了一个断点,并检查了数字集合的数量,并且它中包含正确数量的项目。在重新加载列表并停止活动指示器执行的代码之后,需要30到40秒才能填充列表并且活动指示器停止运行。

名单并最终填充和指示灯消失了,但我得到的调试窗口此错误消息:

此应用程序从后台 线程修改自动布局引擎,这可能会导致发动机腐败和怪异的崩溃。这个 将在未来的版本中导致异常。

我试过用一些方法重新排列所有这些,但没有什么比我现在有更好的工作。我重新安排它的一种方法是在循环后面放置reloadData和stopAnimating。它没有更好的工作,我仍然有上面列出的错误。

我错过了这里的东西,但不知道是什么。有任何想法吗?

回答

2

尝试了这一点:

let activityIndicator = UIActivityIndicatorView.init(activityIndicatorStyle:UIActivityIndicatorViewStyle.WhiteLarge) 
self.view.addSubview(activityIndicator) 

// Switch To Background Thread 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {() -> Void in 

    // Animate Activity Indicator On Main Thread 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     activityIndicator.startAnimating() 
    }) 


    // Do your table calculation work here 


    // Stop Animating Activity Indicator On Main Thread 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     activityIndicator.stopAnimating() 
    }) 
} 
+0

谢谢。这工作完美。我将我的tableView.reloadData调用添加到第二个主队列中,并且所有问题都已清除。感谢您花时间发布此信息。 –

+0

很高兴帮助,欢呼! – Abhinav