IOS-笔记13(Closures, Multithreading)

如果Closures捕获的外部变量直接或间接的指向Closures自己,那么就会在内存中形成循环,这两个对象永远不会被释放,在闭包的最前面加上[unowned varname]。

Multithreading

      队列:IOS里包含很多队列,每个队列里都有排着队的函数或闭包等待被执行。每个队列对应一个线程。

      有一个特殊的队列叫主队列,所有与UI有关的操作只能发生在这里。所有费时的操作都不能发生在这里。

      除了主队列以外,还有这样几个队列:

              QOS_CLASS_USER_INTERACTIVE----很快可以完成,高优先级

              QOS_CLASS_USER_INITIATED----耗时较长,高优先级

              QOS_CLASS_UTILITY----耗时长,优先级不好

              QOS_CLASS_USER_BACKGROUND----用户不关心

       接下来通过这个方法获取到队列:

   let qos = Int(QOS_CLASS_USER_INITIATED.value)
       使用下面的方法和结构,将函数或闭包派遣到另一个线程,当在另外一个线程处理好后,重新回到主线程处理UI的更新:
   <pre name="code" class="objc">   dispatch_async(dispatch_get_global_queue(qos, 0)) { () -> Void in
       let imageData = NSData(contentsOfURL: url)
       dispatch_async(dispatch_get_main_queue()) { () -> Void in
           if url == self.imageURL {
               if imageData != nil {
               self.image = UIImage(data: imageData!)
               } else {
               self.image = nil
               }
           }    
       }
   }

 
 

       你也可以获取一个自己的队列:

let queue = NSOperationQueue()

        并通过闭包向自己的队列发送任务:

<pre name="code" class="objc">queue<span style="font-family: Arial, Helvetica, sans-serif;">.addOperationWithBlock({ () -> Void in})</span>

 
 
      在等待的时候可以使用UIActivityIndicatorView来画小圆圈动画。





              

你可能感兴趣的:(IOS-笔记13(Closures, Multithreading))