一尘不染

使用Alamofire快速关闭

swift

我正在对服务器进行API调用。我正在利用Alamofire来解决这个问题。我正在尝试创建一个使用Alamofire的GET函数返回基于自定义类的对象的函数,该类包含此GET函数提供的各种输出。

我不清楚执行此操作的方式。

这是我的自定义类,其中包含有关响应的详细信息:

import Foundation

class ResponsePackage {

    var success = false
    var response: AnyObject? = nil
    var error: NSError? = nil

}

在另一个类中,我具有以下功能:

func get(apiEndPoint: NSString) -> ResponsePackage {

    let responsePackage = ResponsePackage()

        Alamofire
            .request(.GET, apiEndPoint)
            .responseJSON {(request, response, JSON, error) in
                responsePackage.response = JSON
                responsePackage.success = true
                responsePackage.error = error
        }

    return responsePackage

}

这将返回,nil因为在return执行之前对服务器的调用未完成。我知道我应该能够使用闭包来做到这一点,但是我不确定如何构造它。


阅读 229

收藏
2020-07-07

共1个答案

一尘不染

之间的代码{}等同于Objective-C中的代码块:这是异步执行的代码块。

您所犯的错误是您放置return语句的地方:当您启动请求时,{}直到框架收到响应后,代码才执行,因此,return到达该语句时,机会仍然没有响应。您可以简单地移动以下行:

return responsePackage

在闭包内部,因此func仅在收到响应后才返回。这是一种简单的方法,但并不是真正理想的方法:您的代码将卡在等待答案的过程中。最好的方法也是使用闭包。这看起来像:

   func get(apiEndPoint: NSString, completion: (response: ResponsePackage) -> ()) -> Bool {

        let responsePackage = ResponsePackage()
        Alamofire
            .request(.GET, apiEndPoint)
            .responseJSON {(request, response, JSON, error) in
                responsePackage.response = JSON
                responsePackage.success = true
                responsePackage.error = error

                completion(response: responsePackage)
        }
    }
2020-07-07