【问题标题】:Difficulty with Swift/Alamofire Completion HandlersSwift/Alamofire 完成处理程序的困难
【发布时间】:2019-01-01 09:47:07
【问题描述】:

今天我正在使用 Alamofire 提取一个 int 值。 它很好地提取了 int,但我想将 int 值保存在请求之外(在不同的函数中,viewDidLoad())。

我不确定如何调用完成处理程序,目前它似乎没有做任何事情。

这是提取相关 int 值的方法 (lastModified)。

func checkVersion(completion: @escaping (Int) -> Void) {
    Alamofire.request(versionCheckEndpoint).responseJSON { response in
        if(response.result.value != nil) {
            let json = JSON(response.result.value!)
            self.s3Endpoint = json["s3BucketURL"].stringValue
            let lastModified = json["lastModified"].intValue
            self.latestVersion = lastModified
        }
    }
}

我尝试将值保存到实例变量中,但这不起作用。

我在 viewDidLoad() 中调用了这样的完成处理程序。但我很肯定它远非正确:

 self.checkVersion() { response in
        self.latestVersion = response
    }

谁能告诉我如何将 lastModified 的 int 值保存到某个局部变量,使其不包含在 Alamofire 请求的范围内?

【问题讨论】:

    标签: ios swift networking alamofire completionhandler


    【解决方案1】:

    在函数checkVersion 中没有调用完成块。

    您必须在检索到值后调用它(尽管我建议将其设为可选)

    func checkVersion(_ completion: @escaping (Int?) -> Void) {
        Alamofire.request(versionCheckEndpoint).responseJSON { response in
    
            guard let value = response.result.value else {
                completion(nil)
                return
            }
    
            let json = JSON(value)
            self.s3Endpoint = json["s3BucketURL"].stringValue
            let lastModified = json["lastModified"].intValue
    
            completion(lastModified)
        }
    }
    

    然后这样称呼它:

    self.checkVersion() { value in
    
        guard let value = value else {
            //handle invalid values here
            return
        }
    
        latestVersion = value
        // update the view if needed
    }
    

    【讨论】:

    • 非常感谢您的帮助。也许这与完成处理程序的异步性质有关,但如果我在调用“self.checkVersion”之后尝试打印“latestVersion”或“self.latestVersion”,latestVersion 的值仍然显示为 -1(默认我提供的值。)它会正确更新值,但是一旦完成结束,它就会恢复默认值。
    • 只有在 alamofire 响应中运行完成块后才提供值的两件事。其次,如果您没有等待响应,那么您将获得默认值。我的回答显示了您应该在哪里更新视图或处理块内而不是块外的错误。
    • 我已经将“self.latestVersion = value”完全放在“如果需要,请更新视图”注释中,我只是想在请求/完成块之外使用这个值。也许我可以将它传递给不同的函数来处理它。
    • 你可以使用该值,但只有在完成后它是异步的
    • 看来我只能在完成代码执行时使用该值——在它执行之后,该值就消失了。
    猜你喜欢
    • 2015-12-17
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多