我想我将将所有代码函数从"回调函数"更改为"返回函数"。我不喜欢代码的"楼梯"外观。
您认为这是个好主意吗?
我不了解两者之间的区别(异步的Web服务调用迫使我在我的代码中使用回调函数的呼叫(。
回调功能:
声明:
func methodToSelectData(strQuery : String, dataBase: String, completion: @escaping (_ result: [AnyObject]) -> Void) {
let arryToReturn : [AnyObject] = []
let contactDB = FMDatabase(path: String(methodToCreateDatabase(dataBase: dataBase)!.absoluteString) )
if (contactDB?.open())! {
let results:FMResultSet? = contactDB?.executeQuery(strQuery, withArgumentsIn: nil)
while results?.next() == true {
arryToReturn.add(results!.resultDictionary())
}
if arryToReturn.count == 0 {
completion(arryToReturn)
}
contactDB?.close()
} else {
print("Error: (String(describing: contactDB?.lastErrorMessage()))")
}
completion(arryToReturn)
}
用法:
DBHandler.sharedInstance.methodToSelectData(strQuery:"SELECT * FROM table", dataBase: "DB.db", completion: { resultQuery in
if (resultQuery.count > 0) {
...
}
})
返回功能
声明:
func method2ToSelectData(strQuery : String, dataBase: String) -> [AnyObject] {
let arryToReturn : [AnyObject] = []
let contactDB = FMDatabase(path: String(methodToCreateDatabase(dataBase: dataBase)!.absoluteString) )
if (contactDB?.open())! {
let results:FMResultSet? = contactDB?.executeQuery(strQuery, withArgumentsIn: nil)
while results?.next() == true {
arryToReturn.add(results!.resultDictionary())
}
if arryToReturn.count == 0 {
return arryToReturn
}
contactDB?.close()
} else {
print("Error: (String(describing: contactDB?.lastErrorMessage()))")
}
return arryToReturn
}
用法:
let resultQuery = DBHandler.sharedInstance.method2ToSelectData(strQuery:"SELECT * FROM table", dataBase: "DB.db")
if (resultQuery.count > 0) {
...
}
使用一种或另一种的最佳方法是什么?我不太了解微妙的。
这确实是您在任何给定情况下需要的问题。
对于像返回数据一样简单的事情,您可以做到这一点:
// Definition //
func newString(firstHalf: String, secondHalf: String) -> String {
return firstHalf + secondHalf
}
// Usage //
print(newString(firstHalf: "Hello", secondHalf: "world"))
更复杂的东西,例如数据调用,可能需要一个完成处理程序或闭合:
// Definition //
func getData(fromEndpoint endpoint: String, completion: (String) -> Void) {
let data = serverData(from: endpoint) //Makes the server request.
completion(data)
}
// Usage //
getData(fromEndpoint: "https://www.reddit.com/.json") { data in
doThings(with: data)
}
您不一定需要 使用封闭/回调的异步调用,但它往往是一个最常见的用例之一。当您在Swift中进行更多编码时,您会发现每个编码的更多用例。