Swift2 如何调用包含完成处理程序的函数?

Swift2 如何调用包含完成处理程序的函数?,swift2,alamofire,swifty-json,Swift2,Alamofire,Swifty Json,由于我的大多数应用程序都使用异步的RESTAPI调用,因此仍在尝试获取完成处理程序的挂起状态。我的项目使用Alamofire和SwiftyJSON我有一个类函数,它接受我想要用来调用POSTapi并将值插入数据库的参数。API返回插入的新行的ID。我希望以函数返回的快速JSON对象的形式获取响应。以下是函数: class func insertItem(item: String, description: String, quantityOnHand: Int, reorderPoint: In

由于我的大多数应用程序都使用异步的RESTAPI调用,因此仍在尝试获取完成处理程序的挂起状态。我的项目使用
Alamofire
SwiftyJSON
我有一个类函数,它接受我想要用来调用
POST
api并将值插入数据库的参数。API返回插入的新行的ID。我希望以函数返回的快速
JSON
对象的形式获取响应。以下是函数:

class func insertItem(item: String, description: String, quantityOnHand: Int, reorderPoint: Int, supplier_id:Int, completionHandler: JSON -> Void) {

    let urlEndpoint = Constants.Urls.Inventory.Add
    let newItem = ["item": item, "description": description, "quantityOnHand": quantityOnHand, "reorderPoint": reorderPoint, "supplier_id": supplier_id]

    Alamofire.request(.POST, urlEndpoint, parameters: (newItem as! [String : AnyObject]), encoding: .JSON)
        .responseJSON { response in
            guard response.result.error == nil else {
                //got an error, need to handle it
                print(response.result.error!)
                return
            }

            completionHandler(JSON(response.response!))
    }

}
我正在尝试调用此函数,但我不确定要为完成参数设置什么:

Inventory.insertItem("NewFromFunc", description: "new function!!!", quantityOnHand: 400, reorderPoint: 1, supplier_id: 2, completionHandler: ???)
    }
编辑:按现在的状态更新函数。完成后无法返回任何内容:

    func insertItem(item: String, description: String, quantityOnHand: Int, reorderPoint: Int, supplier_id:Int, completionHandler: (JSON) -> Void) {

        let urlEndpoint = "http://url"
        let newItem = ["item": item, "description": description, "quantityOnHand": quantityOnHand, "reorderPoint": reorderPoint, "supplier_id": supplier_id]

        Alamofire.request(.POST, urlEndpoint, parameters: ((newItem) as! [String : AnyObject]))
            .responseJSON { response in
                //print(newItem)

                guard response.result.error == nil else {
                    //got an error, need to handle it
                    print("Error thread")

                    return
                }
                if let value: AnyObject = response.result.value {
                    //hande results as JSON without bunch of nested if loops
                    let statusCode = response.response?.statusCode
                    if statusCode == 201 {

                        //let newid = value["id"]
                        //let status = value["status"]

                        print("Status is 201")
                        print(value)
                    }
                    else {
                        print("there's an issue returning data")
                    }
                }
                completionHandler(JSON(response.response!))
            }
    }

您需要设置完成处理程序的类型。您的apears应该有一个JSON类型的参数

completionHandler: (JSON) -> Void
completionHandler: ((JSON) -> Void)?
要使它成为可选的,您可以这样做

completionHandler: (JSON) -> Void
completionHandler: ((JSON) -> Void)?
然后你会这样打电话

Inventory.insertItem("NewFromFunc", description: "new function!!!", quantityOnHand: 400, reorderPoint: 1, supplier_id: 2){ data in 
    //Do something with the data object
}
如果要有多个具有相同类型处理程序的方法,也可以通过创建typeAlias来实现

下面是一个示例,说明如何使用typealias在rest客户机类中使用它,因为响应用于多个方法

typealias ServiceResponse = (JSON, NSError?) -> Void

class RESTClient : NSObject {
    static let sharedInstance = RESTClient()

    func makeRequest(type: String, endPoint: String, parameters: [String: AnyObject]?, onCompletion: ServiceResponse){
        makeRequest(type, endPoint: endPoint, parameters: parameters, files: nil, onCompletion: onCompletion)
    }
...

您需要设置完成处理程序的类型。您的apears应该有一个JSON类型的参数

completionHandler: (JSON) -> Void
completionHandler: ((JSON) -> Void)?
要使它成为可选的,您可以这样做

completionHandler: (JSON) -> Void
completionHandler: ((JSON) -> Void)?
然后你会这样打电话

Inventory.insertItem("NewFromFunc", description: "new function!!!", quantityOnHand: 400, reorderPoint: 1, supplier_id: 2){ data in 
    //Do something with the data object
}
如果要有多个具有相同类型处理程序的方法,也可以通过创建typeAlias来实现

下面是一个示例,说明如何使用typealias在rest客户机类中使用它,因为响应用于多个方法

typealias ServiceResponse = (JSON, NSError?) -> Void

class RESTClient : NSObject {
    static let sharedInstance = RESTClient()

    func makeRequest(type: String, endPoint: String, parameters: [String: AnyObject]?, onCompletion: ServiceResponse){
        makeRequest(type, endPoint: endPoint, parameters: parameters, files: nil, onCompletion: onCompletion)
    }
...

您可以创建一个新类

导入UIKit

typealias ServiceResponse=(NSDictionary!,NSError!)->Void

类afninject:NSObject{

func getDataWith(parameters:NSDictionary, url:String, onCompletion: ServiceResponse) -> Void {

    let manager:AFHTTPRequestOperationManager = AFHTTPRequestOperationManager()
    let serializer:AFJSONRequestSerializer = AFJSONRequestSerializer()
    manager.responseSerializer.acceptableContentTypes = NSSet(objects:"text/html") as NSSet as Set<NSObject>
    manager.requestSerializer = serializer
    manager.POST(url, parameters: parameters, success: { (operation: AFHTTPRequestOperation!, responsobject: AnyObject?) -> Void in
        let data = responsobject as! NSDictionary?
        onCompletion(data,nil)
    }) { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in
        let errorObject = error as NSError?
        onCompletion(nil,errorObject)
    }
}

您可以创建一个新类

导入UIKit

typealias ServiceResponse=(NSDictionary!,NSError!)->Void

类afninject:NSObject{

func getDataWith(parameters:NSDictionary, url:String, onCompletion: ServiceResponse) -> Void {

    let manager:AFHTTPRequestOperationManager = AFHTTPRequestOperationManager()
    let serializer:AFJSONRequestSerializer = AFJSONRequestSerializer()
    manager.responseSerializer.acceptableContentTypes = NSSet(objects:"text/html") as NSSet as Set<NSObject>
    manager.requestSerializer = serializer
    manager.POST(url, parameters: parameters, success: { (operation: AFHTTPRequestOperation!, responsobject: AnyObject?) -> Void in
        let data = responsobject as! NSDictionary?
        onCompletion(data,nil)
    }) { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in
        let errorObject = error as NSError?
        onCompletion(nil,errorObject)
    }
}

但是当我调用函数时,如何获取该函数返回的JSON?它是否存储在
data
变量中?我已经尝试使用
data[“id”]获取它
但什么都不起作用。函数应该返回JSON数据。添加完成处理程序导致我将其更改为返回void。我如何返回数据?谢谢!根据值的类型,您应该能够执行类似data[“id”].string。这将返回一个可为null的字符串。如果您确定它不为null,则可以使用stringValue将其展开。各种类型(int、number、bool等)都有这些方法,但调用函数时如何获取函数返回的JSON?它是否存储在
data
变量中?我已尝试使用
data[“id”获取它]
但什么都不起作用。函数应该返回JSON数据。添加完成处理程序导致我将其更改为返回void。我如何返回数据?谢谢!根据值的类型,您应该能够执行类似data[“id”].string。这将返回一个可为null的字符串。如果您确定该字符串不为null,则可以使用stringValue将其展开。对于各种类型(int、number、bool等),有以下方法