completionHandler 的响应为零

Posted

技术标签:

【中文标题】completionHandler 的响应为零【英文标题】:Response of completionHandler is nil 【发布时间】:2017-02-13 23:27:32 【问题描述】:

我有下面的函数,它返回每个用户的课程:

func CoursesPerUser(controler: UIViewController, completionHandler: @escaping (Result<[Course]>) -> Void)

    Alamofire.request(Constants.API.Users + UserId() + Constants.API.CoursesPerUser + Token(), encoding: JSONEncoding.default).responseJSON  response in

        guard response.result.error == nil else 
            print(response.result.error!)
            completionHandler(.failure(response.result.error!))
            return
        

        guard let json = response.result.value as? [[String: AnyObject]] else 
            print("Didn't get course objects as JSON from API")
            completionHandler(.failure(BackendError.objectSerialization(reason: "Did not get JSON array in response")))
            return
        

        var courses:[Course] = []
        for element in json 
            if let courseResult = Course(json: element) 
                courses.append(courseResult)
            
        
        completionHandler(.success(courses))
    

当我调用函数时,响应的值为 nil。

NetworkManager.sharedInstance.CoursesPerUser(controler: controler)  response in

        print("Size of courses" + String(describing: response.value?.count))


我已经打印了函数 CoursesPerUser 中的每个元素,并且一切正常。我想知道我是否没有以良好的方式处理结果。

【问题讨论】:

请将您的解决方案作为答案发布,因为其他人可能会遇到此问题,如果您的解决方案采用答案的形式,它将更具可读性。 【参考方案1】:

我已经解决了这个问题。解决方法如下。

func CoursesPerUser(completionHandler: @escaping ([Course]?, NSError?) -> ())

    Alamofire.request(Constants.API.Users + UserId() + Constants.API.CoursesPerUser + Token(), encoding: JSONEncoding.default).responseJSON  response in

        switch response.result 

        case .success :


            if let result: AnyObject = response.result.value as AnyObject? 

                if(response.response?.statusCode == 200)

                    var courses:[Course] = []

                    if let array = JSON(result).array 

                        for element in array 

                            if let course = Course(json: element) 

                                courses.append(course)

                            

                        
                    

                    completionHandler(courses, nil)

                 else 

                    if let message = JSON(result)["message"].string 

                        print("Logg: " + message)

                    
                

            

        case .failure(let error):

            completionHandler(nil, error as NSError?)
        
    




NetworkManager.sharedInstance.CoursesPerUser()  courses, error in

    if(error == nil) 

        print("Size of courses" + String(describing: courses.count))

     else 

        print("Log: " + String(describing: error))

    


【讨论】:

以上是关于completionHandler 的响应为零的主要内容,如果未能解决你的问题,请参考以下文章

在啥情况下 [NSDocument fileURL] 可以为零?

如何保存 CompletionHandler 返回的值?

在 NSURLConnection 中的 Swift 中从 completionHandler 中获取数据

响应数据为零

AFNetworking 无法序列化压缩响应(响应对象为零)

响应式设计:为啥高度为零和 padding-bottom 可以使 div 响应大小?