Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我是否需要DispatchQueue.main在Alamofire请求后更新UI?_Ios_Swift_Alamofire_Grand Central Dispatch - Fatal编程技术网

Ios 我是否需要DispatchQueue.main在Alamofire请求后更新UI?

Ios 我是否需要DispatchQueue.main在Alamofire请求后更新UI?,ios,swift,alamofire,grand-central-dispatch,Ios,Swift,Alamofire,Grand Central Dispatch,我正在学习一个关于使用REST/web请求的教程。在本教程中,我们正在开发一个Pokedex应用程序,在该应用程序中,我们使用Alamofire从API获取口袋妖怪的详细信息,然后在UI中显示这些数据 以下是相关代码: typealias DownloadComplete = (Bool) -> () // Model class func downloadPokemonDetails(completed: @escaping DownloadComplete) {

我正在学习一个关于使用
REST/web请求的教程。在本教程中,我们正在开发一个Pokedex应用程序,在该应用程序中,我们使用
Alamofire
从API获取口袋妖怪的详细信息,然后在UI中显示这些数据

以下是相关代码:

typealias DownloadComplete = (Bool) -> ()

// Model class
func downloadPokemonDetails(completed: @escaping DownloadComplete)
    {
        Alamofire.request(_pokemonURL).responseJSON { (response) in
            var success = true
            if let jsonData = response.result.value as? Dictionary<String, Any>
            {
                // parse the json here
                ...
            }
            else
            {
                success = false
            }
            completed(success)
        }
    }

// Controller class
override func viewDidLoad() {
        super.viewDidLoad()
        pokemon.downloadPokemonDetails(completed: { (success) in
            if success
            {
                self.updateUI()
            }
            else
            {
                print("FAILED: TO PARSE JSON DATA")
            }
        })
    }

func updateUI()
{
    attackLbl.text = pokemon.attack
    defenseLbl.text = pokemon.defense
    heightLbl.text = pokemon.height
    weightLbl.text = pokemon.weight
}

教程遗漏了它,我不确定这里是否需要
DispatchQueue
来更新UI。我知道在后台线程中更新UI是一种不好的做法,所以如果有人能够说明是否需要在这里使用DispatchQueue来获取主线程,我将非常感激

如果你不想阅读整个评论部分,我会把它作为答案发布在这里。 首先,read,它清楚地说明:“默认情况下,响应处理程序在主调度队列上执行。”

这意味着,您可以在响应块中调用任何与UI相关的代码。如果您仍然对依赖第三方lib doc感到不舒服,您可以通过执行以下
swift3
代码片段进行检查:

if Thread.isMainThread { 
   print("Main Thread") 
}
xcode 9

xcode 9开始有一个内置的
主线程检查器
,它检测来自后台线程的AppKit、UIKit和其他API的无效使用<代码>主线程检查器
在使用Xcode调试器运行应用程序时自动启用

如果项目的任何部分包含来自后台线程的无效UI调用,您将看到以下内容:


**在Xcode 9.1版(9B55)中演示过

您看过吗?-“默认情况下,响应处理程序在主调度队列上执行…”@MartinR感谢您的评论。实际上我没有,但这是否意味着在这种情况下,在更新UI时不再需要DispatchQueue.main?我还是个新手,你不需要。您可以通过
dispatch\u get\u current\u queue()==dispatch\u get\u main\u queue()
感谢@NeilGaliaskarov的确认。我想使用您发布的代码片段进行验证,但
dispatch\u get\u current\u queue()
已被弃用,我无法使用它来自行查找。我似乎找不到替代品。
if Thread.isMainThread{print(“Main Thread”)}
if Thread.isMainThread { 
   print("Main Thread") 
}