快速关闭Alamofire

sha*_*zzo 10 swift alamofire

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

我不清楚这样做的方式.

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

import Foundation

class ResponsePackage {

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

nilreturn在执行获取之前对服务器的调用未完成时返回的.我知道我应该能够用闭包来做这个,但我不知道如何构建它.

Emi*_*lie 9

它之间的代码{}相当于objective-C中的块:这是一块异步执行的代码块.

您所做的错误是您放置return语句的位置:当您启动请求时,{}在框架收到响应之前不会执行代码,因此在return达到语句时,可能仍然没有响应.你可以简单地移动这条线:

return responsePackage
Run Code Online (Sandbox Code Playgroud)

在封闭内部,所以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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@Emilie.我该怎么称呼这个功能? (2认同)

Ale*_*ano 5

我举一个例子,关注带有闭包的responseJSON问题:

按照这个小步骤:

首先,您可以在通用类中创建自定义类型(例如Constants.swift类):

typealias apiSuccess = (result: NSDictionary?) -> Void
typealias apiProgress = (result: NSDictionary?) -> Void // when you want to download or upload using Alamofire..
typealias apiFailure = (error: NSDictionary?) -> Void
Run Code Online (Sandbox Code Playgroud)

然后在你的班上:

// Normal http request with JSON response..
func callJSONrequest(url:String, params:[String: AnyObject]?, success successBlock :apiSuccess,
    failure failureBlock :apiFailure) {

        Alamofire.request(.GET, url, parameters: params, encoding: ParameterEncoding.URL)
            .responseJSON { response in
                print("\(response.request?.URL)")  // original URL request
                //print(response.response) // URL response
                //print(response.data)     // server data
                //print(response.result)   // result of response serialization
                if response.result.isSuccess {
                    let jsonDic = response.result.value as! NSDictionary
                    successBlock(result: jsonDic)

                } else {
                    let httpError: NSError = response.result.error!
                    let statusCode = httpError.code
                    let error:NSDictionary = ["error" : httpError,"statusCode" : statusCode]
                        failureBlock(error: error)
                    }
                }
        }
}

func myCommonFunction() {
   let myApiSuccess: apiSuccess = {(result: NSDictionary?) -> Void in 
      print ("Api Success : result is:\n \(result)")
      // Here you can make whatever you want with result dictionary
   }
   let myApiFailure: apiFailure = {(error: NSDictionary?) -> Void in 
      print ("Api Failure : error is:\n \(error)")
      // Here you can check the errors with error dictionary looking for http error type or http status code
   }
   var params :[String: AnyObject]?
   let name : String! = "this is my name"
   let id : String! = "000a"
   params = ["name" : name, "id" : id]
   let url : String! = "https://etc..."
   callJSONrequest(url, params:params, success: myApiSuccess, failure: myApiFailure)
}
Run Code Online (Sandbox Code Playgroud)