Swift異步執(zhí)行的關(guān)鍵在于Closures,其具體語法如下:###
{ (parameters) -> return type in
statements
}
首先靠柑,拿簡單的排序來簡單說明一下:(無聊請(qǐng)略過)###
- 字符串排序躁染,定義排序方法
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] //將要排序的數(shù)組
func backward(_ s1: String , _ s2: String ) -> Bool{
return s1 > s2 //倒序
}
2.借助Swift自帶排序函數(shù)膝捞,其語法如下:
names.sorted(by: (String, String) -> Bool) //接收兩個(gè)string參數(shù)返回Bool值,與上面定義的函數(shù)對(duì)應(yīng)
3.那么排序可這么執(zhí)行:
var reversedNames = names.sorted(by: backward)
輸出結(jié)果:["Ewa", "Daniella", "Chris", "Barry", "Alex"]
4.使用Closures套用其語法可以這樣寫:
reversedNames = names.sorted(by: {(_ s1: String, _ s2: String) -> Bool in
return s1 > s2
})
5.因?yàn)楦鶕?jù)names的類型可以推斷出參數(shù)的類型和返回值葱弟,并且如果Closures里只有一條語句可以省略return,可以簡寫為:
reversedNames = names.sorted(by: { s1,s2 in s1 > s2})
6.由于Swift在帶有快速參數(shù)壹店,分別是$0,$1...分別代表第一個(gè)參數(shù)、第二個(gè)參數(shù)等等芝加,因此我們可以進(jìn)一步簡化為:
reversedNames = names.sorted(by: { $0 > $1})
7.另外硅卢,為了方便,Swift專門對(duì)字符串的比較定義了方法(>或<)藏杖,其結(jié)構(gòu)就是接受兩個(gè)字符串将塑,返回true或者是false,所以我們也可以這樣去寫:
reversedNames = names.sorted(by: >) //倒序
reversedNames = names.sorted(by: <) //升序
異步說明###
假設(shè)我們?cè)谧鲆粋€(gè)下載器蝌麸,創(chuàng)建了一堆任務(wù)進(jìn)行下載点寥,那么在任務(wù)完成的時(shí)候我們要對(duì)用戶進(jìn)行提醒,比如吐司或者是彈框亦或是本地通知提醒来吩。這是很自然的敢辩,我們會(huì)用到Closures蔽莱。于是我們這樣去寫:
func startDownloadTask(completionHandler: () -> Void){
completionHandler() //當(dāng)startDownloadTask return之后執(zhí)行completionHandler
}
這樣去寫單個(gè)的下載不會(huì)有太大的問題。試想一下戚长,如果要求你在所有的下載結(jié)束之后匯總進(jìn)行提示呢盗冷?那我們就不能這樣去寫了,起碼單個(gè)下載完成之后不應(yīng)該立刻就執(zhí)行completionHandler同廉,這是就要跳出Closures仪糖,Swift上稱為Escaping Closures。改造上面的方法如下:
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void ) {
completionHandlers.append(completionHandler)
}
但下載隊(duì)列中沒有任務(wù)在執(zhí)行了之后迫肖,在處理所有的completionHandlers锅劝。
附上Swift3.0的改進(jìn):
DispatchQueue.global().async {}
DispatchQueue.main.async(execute: {refreshView.endLoading()})
}