【问题标题】:Strength order of code executing (Swift) [duplicate]代码执行的强度顺序(Swift)[重复]
【发布时间】:2015-08-10 11:05:25
【问题描述】:

当靠近程序结束的部分代码首先执行与靠近程序开始的部分代码比较时,我遇到了强度问题

var count = 0
        var save = NSUserDefaults.standardUserDefaults()

         Alamofire.request(.GET, "")
                .responseString(encoding: NSUTF8StringEncoding) { (request, response, string, error) -> Void in

                    println("res: "+string!)
                    count = string!.toInt()!


            }

println(count)  

这里。首先 Alamofire 发出请求并将响应数据设置为变量“count”。其次,我正在打印计数值以进行检查。

在调试器中我看到了

我怎么会首先看到打印的“计数”值,然后我看到 Alamofire 响应?我应该如何解决它?我需要计数成为从字符串转换为整数的 alamofire 响应

【问题讨论】:

  • 仅供参考,有时可能值得发布您的实际代码而不是图像,以便人们可以将其复制并粘贴到他们的计算机上。这可能会更容易帮助你:)
  • AlamoFire README 明确提到了请求的异步性质:“Alamofire 中的网络是异步完成的。......请求的结果仅在响应处理程序的范围内可用。” 。 – 链接到的线程是alamofire 的“频繁”选项卡上的#1。

标签: xcode swift


【解决方案1】:

使用此 API 发出的请求是异步的。这意味着您的代码会继续执行并调用println(count)响应闭包中的代码执行之前。 URL请求需要时间,需要异步代码来防止阻塞主线程。

您需要重新构建代码以考虑到您正在使用异步方法调用这一事实。例如,您上面的方法可能需要采用您从响应的闭包中调用的自己的 completion 闭包,然后将您的 count 传递回那里。

func executeRequest(completion: (count: Int) -> ()) {
    Alamofire.request(.GET, "http://my1test.ru/applejesus.php?task=getCategoryCount").responseString(encoding: NSUTF8StringEncoding) { (request, response, string, error) -> Void in
        println("res: "+string!)
        let count = string!.toInt()!
        completion(count)
    }
}

【讨论】:

    【解决方案2】:

    Alamofire 工作 asynchronously 这意味着它将在后台执行任务并继续执行其余代码。所以在这种情况下,代码是同时执行的。执行任务asynchronously 有助于提高性能,尤其是在大型程序中,因为一个接一个地执行代码需要很长时间。

    一个简单的解决方法是将打印语句放在Alamofire 块中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      相关资源
      最近更新 更多