Swift ios alamofire 数据在 viewDidLoad 中第一次返回空

Posted

技术标签:

【中文标题】Swift ios alamofire 数据在 viewDidLoad 中第一次返回空【英文标题】:Swift ios alamofire data returning empty first time in viewDidLoad 【发布时间】:2015-06-09 14:06:15 【问题描述】:

我正在尝试将数据从 API 加载到我的视图控制器中,但第一次加载数据时返回空

import UIKit

class AdViewController: UIViewController 

    var adId: Int!

    var adInfo: JSON! = []

    override func viewDidLoad() 
        super.viewDidLoad()

        loadAdInfo(String(adId),page: 1)

        println(adInfo)  // This shows up as empty

    



    func loadAdInfo(section: String, page: Int) 
        NWService.adsForSection(section, page: page)  (JSON) -> () in
            self.adInfo = JSON["ad_data"]

            println(self.adInfo) // This shows up with data

        
    

我在调用“println(adInfo)”之前正在运行“loadAdInfo()”,但它仍然显示为空数组

adsForSection:

static func adsForSection(section: String, page: Int, response: (JSON) -> ()) 
        let urlString = baseURL + ResourcePath.Ads.description + "/" + section
        let parameters = [
            "page": toString(page),
            "client_id": clientID
        ]
        Alamofire.request(.GET, urlString, parameters: parameters).responseJSON  (_, res, data, _) -> Void in
            let ads = JSON(data ?? [])
            response(ads)

            if let responseCode = res 
                var statusCode = responseCode.statusCode
                println(statusCode)
            

            println(ads)

        
    

【问题讨论】:

您的loadAdInfo 方法可能是异步的。检查(或向我们展示)NWService.adsForSection 的工作原理。 我现在更新了我的问题@EricD。 与您使用completionHandler 将Alamofire 的数据从adsForSection 获取到loadInfo 的方式相同,您需要为loadInfo 创建一个处理程序,以便您可以检索异步响应。 感谢@EricD。 ,我对此真的很陌生,所以如何将其添加到 func loadAdInfo(section: String, page: Int) Vendioservice.adsForSection(section, page: page) (JSON) -> () in self.adInfo = JSON ["ad_data"] println(self.adInfo) 【参考方案1】:

您的 loadAdInfo 方法是异步的。

与您使用completionHandler 将Alamofire 的数据从adsForSection 获取到loadInfo 的方式相同,您需要为loadInfo 创建一个处理程序,以便您可以检索异步响应。

类似这样的:

func loadAdInfo(section: String, page: Int, handler: (JSON) -> ()) 
    NWService.adsForSection(section, page: page)  (JSON) -> () in
        handler(JSON)
    

在你的viewDidLoad:

loadAdInfo(String(adId), page: 1)  handled in
    println(handled["ad_data"])
    self.adInfo = handled["ad_data"]

【讨论】:

感谢您的帮助,今天学到了一些新东西。干杯!

以上是关于Swift ios alamofire 数据在 viewDidLoad 中第一次返回空的主要内容,如果未能解决你的问题,请参考以下文章

Swift ios alamofire 数据在 viewDidLoad 中第一次返回空

iOS Swift + Alamofire 上传带有 exif 数据的照片

类型“any”在alamofire 4 iOS swift中没有下标成员[重复]

如何使用序列化为数据的响应数据处理程序(通过 AlamoFire 的 Swift 3)

Swift - 使用 alamofire 发布请求

支持 swift 3.0 和 iOS 8.0+ 的等效 Alamofire 库