如果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>