IOS SWIFT - 在服务呼叫完成提取时返回响应数据

时间:2016-04-28 05:18:33

标签: ios swift service return complete

我有一个在json中返回响应的Web服务。 我在iphone的xcode(swift)中为数据访问创建了一个单独的类。 我想要做的是在数据访问层中调用一个函数,该函数返回响应字典,WHEN FETCHING IS COMPLETE。 问题:如何仅在从服务获取完成时返回。 例如:学生表 - >点击学生 - >获取学生数据 - >获取完毕后返回数据

func getUser(userID:String)->NSDictionary{

        let manager = AFHTTPRequestOperationManager()
        let parameters = ["uid":userID]
        manager.POST(urlStudentInfo, parameters: parameters,
            success: {(operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
                print("JSON success: " + responseObject.description)
                if let responseDic = responseObject as? NSDictionary{
                    let isUser = responseDic["status"] as! Bool

                    if isUser{



                    }else{

                    }
                }

            },

            failure: { (operation: AFHTTPRequestOperation!,error: NSError!) in

        })

    return response

}

这是我的功能结构。返回完成后会出现问题。所以回报总是零。

任何人都有建议在提取完成后才返回?

2 个答案:

答案 0 :(得分:1)

{callService}实际上是什么样的?它有完成处理程序吗?但一般来说,像webservices这样的异步函数不能像普通函数一样被考虑,你需要在一个函数中启动ws调用,然后调用另一个函数让某些东西知道它是从完成处理程序中完成的,或者是什么让ws函数知道它已完成。简而言之,您不应该尝试从该函数返回任何内容,而是从完成处理程序返回值

编辑:

我建议不要使用NSNotifications,而是委托回调,或者直接使用完成处理程序中的数据。但无论是什么尝试使用返回的NSDictionary应该是这个函数所在的类的委托(如果你不知道它是如何工作的,请查阅协议的教程),然后你可以通过完成内部的委托回调传递字典handler(想想UITableviews如何让你实现所有这些功能以使其工作,你需要为你的webservice调用做类似的事情)

this answer可能会帮助您理解我的意思

答案 1 :(得分:0)

因为您正在调用异步方法,所以不应尝试立即返回值。相反,提供一个“完成处理程序”闭包,您可以在稍后返回结果时调用它。

我还建议至少使用AFNetworking 3.x(因为AFNetworking 2.x的AFHTTPRequestOperationManager使用的NSURLConnection现已弃用了:

func getUser(userID:String, completionHandler: (NSDictionary?, NSError?) -> ()) {
    let manager = AFHTTPSessionManager()
    let parameters = ["uid":userID]
    manager.POST(urlStudentInfo, parameters: parameters, progress: nil, success: { task, responseObject in
        if let responseDic = responseObject as? NSDictionary, let isUser = responseDic["status"] as? Bool {
            if isUser{
                completionHandler(responseDic, nil)
            } else {
                let error = NSError(domain: NSBundle.mainBundle().bundleIdentifier!, code: 1, userInfo: [NSLocalizedDescriptionKey: "status false"])
                completionHandler(nil, error)
            }
        } else {
            let error = NSError(domain: NSBundle.mainBundle().bundleIdentifier!, code: 2, userInfo: [NSLocalizedDescriptionKey: "Response not dictionary; or status not found"])
            completionHandler(nil, error)
        }
    }, failure: { task, error in
        completionHandler(nil, error)
    })
}

你会这样称呼它:

getUser(userID) { responseDictionary, error in
    guard responseDictionary != nil && error == nil else {
        print(error)
        return
    }

    // do something with responseDictionary here
}

// but do not try to use responseDictionary here, because the above runs asynchronously

或者,甚至更好,您可以考虑使用Alamofire。例如,请参阅https://stackoverflow.com/a/27393174/1271826