You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4中Alamofire请求返回JSON/数组为空问题求助

问题原因与解决方案

嘿,作为Swift新手遇到这种问题太正常啦——你踩了异步网络请求的经典坑!

为什么你的函数返回空结果?

Alamofire的request方法是异步执行的:当你调用getSeats()时,函数会立刻启动网络请求(在后台线程运行),然后直接执行后面的return语句,这时候请求还没完成,你返回的只是一开始初始化的空JSON或者空数组。等请求真正拿到数据的时候,函数早就已经返回了,自然拿不到有效结果。


解决方案1:使用闭包(Completion Handler)

这是处理异步请求最传统的方式,通过闭包在请求完成后传递结果:

针对返回JSON的版本

func getSeats(completion: @escaping (JSON?) -> Void) {
    Alamofire.request(url, method: .get)
        .responseJSON { response in
            switch response.result {
            case .success(let value):
                let json = JSON(value)
                completion(json) // 请求完成后把结果传给闭包
            case .failure:
                KRProgressHUD.showError(withMessage: "Could not retrieve reserved seats")
                completion(nil) // 请求失败时传nil
            }
        }
}

调用方式:

// 在需要获取座位数据的地方调用
getSeats { json in
    guard let seatsJson = json else { return }
    // 这里可以处理拿到的JSON数据
    print(seatsJson)
}

针对返回Int数组的版本

func getSeats(completion: @escaping ([Int]?) -> Void) {
    Alamofire.request(url, method: .get)
        .responseJSON { response in
            switch response.result {
            case .success(let value):
                let json = JSON(value)
                let seatNumbers = json.arrayValue.map { $0["seat_no"].intValue }
                completion(seatNumbers) // 传递处理好的座位号数组
            case .failure:
                KRProgressHUD.showError(withMessage: "Could not retrieve reserved seats")
                completion(nil)
            }
        }
}

调用方式:

getSeats { seatNumbers in
    guard let seats = seatNumbers else { return }
    print(seats) // 会输出 [6, 27]
    // 在这里用座位号做后续逻辑,比如更新UI
}

解决方案2:使用Async/Await(Swift 5.5+ 推荐)

如果你的项目使用Swift 5.5及以上版本,推荐用async/await语法,代码更简洁易读,不用嵌套闭包。需要确保Alamofire版本在5.4及以上(它已经支持异步等待)。

针对返回JSON的版本

func getSeats() async throws -> JSON {
    // 用await等待请求完成
    let responseValue = try await Alamofire.request(url, method: .get)
        .serializingJSON()
        .value
    return JSON(responseValue)
}

调用方式(必须在async上下文里调用,比如用Task包裹):

Task {
    do {
        let json = try await getSeats()
        // 处理JSON数据
        print(json)
    } catch {
        KRProgressHUD.showError(withMessage: "Could not retrieve reserved seats")
    }
}

针对返回Int数组的版本

func getSeats() async throws -> [Int] {
    let responseValue = try await Alamofire.request(url, method: .get)
        .serializingJSON()
        .value
    let json = JSON(responseValue)
    return json.arrayValue.map { $0["seat_no"].intValue }
}

调用方式:

Task {
    do {
        let seats = try await getSeats()
        print(seats) // [6, 27]
        // 后续逻辑,比如更新UI
    } catch {
        KRProgressHUD.showError(withMessage: "Could not retrieve reserved seats")
    }
}

内容的提问来源于stack exchange,提问作者user1514567

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:48:50