循环

时间:2015-10-15 03:33:15

标签: ios multithreading swift uitableview uiactivityindicatorview

我正在使用一个有很多工作循环的应用。循环生成一堆数字,然后将它们放入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秒,活动指示器将停止运行。

列表最终填充并且指示符消失,但我在调试窗口中收到此错误消息:

  

此应用程序正在从后台修改autolayout引擎   线程,这可能导致引擎损坏和奇怪的崩溃。这个   将在未来版本中引发异常。

我试过以多种方式重新安排所有这些,但没有比现在更好的了。我重新安排它的方法之一是在循环之后立即放置reloadData和stopAnimating。它没有任何效果,我仍然遇到上面列出的错误。

我在这里遗漏了一些东西,但不确定是什么。有什么想法吗?

1 个答案:

答案 0 :(得分: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()
    })
}
相关问题