gpt4 book ai didi

ios - DispatchQueue vs 委托(delegate) vs Swift 中的闭包

转载 作者:搜寻专家 更新时间:2023-11-01 06:16:23 25 4
gpt4 key购买 nike

对不起,如果这是一个菜鸟问题,但我不知道在接收到 API 请求后执行代码块与通过 GCD、委托(delegate)和闭包解析之间的区别。

据我所知,创建 session 以从 API URL 下载数据是在主线程上完成的,除非我在 GCD block 或委托(delegate)或闭包中执行代码。

这里有两个例子:使用 GCD

DispatchQueue.global(qos: .utility).async {

let requestURL = URL(string: "http://echo.jsontest.com/key/value/one/two")
let session = URLSession.shared
let task = session.dataTask(with: requestURL!) {
(data, response, error) in

print(data as Any)

DispatchQueue.main.async {
print("Hello")
}
}
task.resume()
}

使用委托(delegate):

import Foundation
import UIKit

protocol WeatherDataDownloaderProtocol {
func setData(weatherData: WeatherData)
}

class WeatherDataDownloader {
var weatherData = WeatherData()
var delegate: WeatherDataDownloaderProtocol?

func downloadWeatherData() {
let API_URL = WEATHER_FORECAST_URL
guard let URL = URL(string: API_URL) else {
print("Error: No valid URL")
return
}
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)

let task = session.dataTask(with: URL) { (data, response, error) in
guard error == nil else {
print("Error getting data")
print("\(error)")
return
}

guard let responseData = data else {
print("Error: Did not receive data")
return
}

do {
guard let JSON = try JSONSerialization.jsonObject(with: responseData, options: []) as? Dictionary<String, AnyObject> else {
print("Error: Error trying to convert data to JSON")
return
}

print(JSON)

self.sendDataBack()

} catch {
print("Error: Parsing JSON data error")
return
}
}
task.resume()
}

func sendDataBack() {
if let _delegate = delegate {
_delegate.setData(weatherData: weatherData)
}
}
}

print("Hello") 和 print(JSON) + self.sendDataBack() 都将在 JSON 被检索和解析后执行。这两种方法有什么区别?如果我在等待网络响应时导航出 viewController,这与我的应用程序是否会崩溃有什么关系吗?

非常感谢

最佳答案

在您的第一种方法中,.async 调用不是必需的。 URLSession dataTask 是后台任务。

所以选择不是 GDC 与委托(delegate),而是完成处理程序与委托(delegate)。

基于意见:

使用委托(delegate)需要更多工作并且更难阅读,因为您必须检查代码的其他区域是否实际设置了委托(delegate)以及它是谁以及它实际做了什么。

如果代理在您的网络调用完成时不再存在,则可能不会执行任何代码。因此,对于这种情况,我请求使用完成闭包。

关于ios - DispatchQueue vs 委托(delegate) vs Swift 中的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44002286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com