Swift 作为全局属性的活动指示器

Swift 作为全局属性的活动指示器,swift,android-activity,properties,global,indicator,Swift,Android Activity,Properties,Global,Indicator,我对编程还是很陌生,有时它会用一些非常基本的概念来折磨我。 我在tableviewcontroller中定义了一个活动指示器作为出口 @IBOutlet weak var activityIndicator: UIActivityIndicatorView! 用数据填充tableview的数据下载在具有下载功能的类中的单独文件中完成。这些函数包括下载的完成处理程序。现在,如果我想插入 activityIndicator.stopAnimating() 在完成部分,我得到消息“使用未解析标识

我对编程还是很陌生,有时它会用一些非常基本的概念来折磨我。 我在tableviewcontroller中定义了一个活动指示器作为出口

 @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
用数据填充tableview的数据下载在具有下载功能的类中的单独文件中完成。这些函数包括下载的完成处理程序。现在,如果我想插入

activityIndicator.stopAnimating()

在完成部分,我得到消息“使用未解析标识符activityIndicator”。如何使acitivityIndicator分别成为全局属性,如何使下载类/函数识别tableViewController中定义的activityIndicator?我知道这对大多数人来说可能是一个愚蠢的问题,但我不知道如何解决这个问题。

理想情况下,您不希望下载代码“知道”有关activityIndicator的信息。当viewController调用下载时,可以传递另一个完成处理程序。然后,当下载完成处理程序运行时,调用这个新的完成处理程序。viewController知道activityIndicator,因此可以停止它。大致如下:

 // In ViewController
     myThing.doTheDownload(completion: {
         dispatch_async(dispatch_get_main_queue(), {
             self.activityIndicator.stopAnimating()
         })
     })

 // In download code
     func doTheDownload(completion completionHandler: (() -> Void)) {
          download(completion: {
              completionhandler()
          })
     }

请注意,activityIndicator是一个UI元素,因此其代码必须在主线程上运行。

还有一个问题-如果我有许多带有完成处理程序的下载函数,并且我希望activityIndicator仅在下载完所有函数后才停止,该怎么办?它们都可以调用相同的完成处理程序,它会计算通话次数,并在达到总数时停止指示灯。唯一需要注意的是计数必须是线程安全的,因此如果在主队列上也这样做的话,这是最简单的。