Swift 什么是完成处理程序
在 Swift 中,完成处理程序是一个代码块,用于执行和处理任务的完成状态。例如,完成处理程序非常常用于使用 URLSession 类的网络请求。基本上,完成处理程序被作为一个函数参数传递,并在任务完成后被调用。它并不影响任务是否成功完成。
你可以在你的iOS应用程序中使用完成处理程序来执行不同的动作。有一些实现完成处理程序的常见做法,比如在FileManager操作中清理完未使用的资源后返回状态,在一个语句块内更新多个用户界面,完成后返回等。
In this article, you will see the below examples to see how to use completion handlers effectively −
- 使用URLSession类来获取数据,并在从URL获得响应后返回完成处理程序。
-
过滤一个数组,在成功过滤出数组后返回完成处理程序。
-
使用电子邮件和密码执行用户认证的网络请求。从服务器得到响应后,返回完成处理程序。
让我们看看Swift中完成处理程序的不同例子 –
使用URLSession()类来获取数据
下面是一个以完成处理程序为参数的函数的例子—-。
例子
func fetchData(_ completion: @escaping (_ success: Bool, _ data: Data?) -> Void) {
// Build an URL
let url = URL(string: "sample_url")!
// Perform the network request
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
// Success, call the completion handler with the data
completion(true, data)
} else {
// Failure, call the completion handler with nil data
completion(false, nil)
}
}
task.resume()
}
下面是一个你可能使用上述函数的例子–
self.fetchData { success, data in
if success {
guard let dataObject = data else { return }
// Parse the data and update the UI
let json = try? JSONSerialization.jsonObject(with: dataObject)
print(json!)
} else {
// Show an error message
print("Network request failed")
}
}
本例中的fetchData()函数接受了一个完成处理程序作为一个参数。一个成功的布尔值和网络调用所传递的数据是发送给完成处理程序的两个参数。这个函数发出了一个网络请求;当它成功或不成功时,它调用完成处理程序并将相关的成功值和数据值传递给它。
筛选一个数组
另一个例子是需要时间的操作,如过滤一个数组
例子
func filterArray(_ array: [Int], completion: @escaping (_ filteredArray: [Int]) -> Void) {
DispatchQueue.global().async {
let filteredArray = array.filter { $0 > 5 }
DispatchQueue.main.async {
completion(filteredArray)
}
}
}
下面是一个你可能使用上述函数的例子–
let originalArray: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filterArray(originalArray) { filteredArray in
print("Original array: \(originalArray)")
print("Filtered array: \(filteredArray)")
}
输出
Original array: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Filtered array: [6, 7, 8, 9, 10]
用户认证过程
下面是一个使用完成处理程序来处理用户认证过程结果的函数的例子
例子
func login(username: String, password: String, completion: @escaping (_ success: Bool, _ error: Error?) -> Void) {
// Perform the login process
Auth.auth().signIn(withEmail: username, password: password) { authResult, error in
if let error = error {
// Login failed, call the completion handler with the error
completion(false, error)
} else {
// Login succeeded, call the completion handler with success
completion(true, nil)
}
}
}
下面是一个关于如何使用这个函数的例子
login(username: "user@example.com", password: "password") { success, error in
if success {
// Show the home screen
} else {
// Show an error message
print(error)
}
}
这个函数执行了用给定的电子邮件和密码登录用户的任务。如果登录过程是成功的,它就会调用完成处理程序,否则就会传递错误信息。
在你的代码中使用完成处理程序时,你应该记住一些要点。
- 有时,在嵌套完成处理程序的情况下,完成处理程序会使你的代码变得复杂,难以阅读和理解。
-
对于异步操作,完成处理程序可能难以管理。
-
在嵌套完成处理程序的情况下,回调可能难以维护。
-
不正确地使用完成处理程序会产生保留周期,导致内存泄漏。
结论
在每个插图中,函数执行了一个特定的任务,然后调用完成处理程序来处理其结果。利用完成处理程序可以使函数异步地完成任务并立即返回,而不会延迟程序的其他执行部分。
完成处理程序可以用来更新用户界面或对任务的结果进行任何必要的清理或处理。因此,函数可以立即返回,而不必等待工作完成,开发者也可以在不阻塞的情况下处理结果。Swift程序员经常采用完成处理程序,这是一种管理异步进程和增强代码响应能力的有用技术。