在iOS中的多个地方使用响应

问题描述 投票:0回答:1

我尝试了 Stack Overflow 和 Google 上的很多方法 但我没能达到我所需要的。

我只是想将 API 请求的响应存储到某个变量 这样我就可以自由使用它了。

这是代码:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var responseLabel: UILabel!
let apiUrlStr = "http://jsonplaceholder.typicode.com/posts"

var resData = NSArray()

override func viewDidLoad() {
    super.viewDidLoad()
    request(.GET, apiUrlStr, encoding: .JSON).responseJSON { (_, _, JSON, _) in
        let arr = JSON as NSArray
        let user = arr[0] as NSDictionary
        self.responseLabel.text = user.objectForKey("title") as? String
        
        self.resData = JSON as NSArray //i cant get this from outside
    }
    
    println(resData) //prints nothing but empty parentheses while inside the request it prints the data right
    }
}

因为我有多个类,并且每个类都需要以不同的方式处理响应,所以我想创建一个具有将返回响应的响应方法的 API 类。

也许是这样的:

class api{
    func req(url: String, params: NSDictionary){
        //method goes here
    }
    
    func res() -> NSDictionary{
        //method goes here
        var response = NSDictionary()
        return response
    }
}

然后在viewdidload中像这样使用它

let params = ["aaa","bbb"]
let api = api()
api.req(apiUrlStr, params)
let res = api.res()

***顺便说一句,我现在使用的请求方法来自 Alamofire.swift,我不介意使用其他方法

以下是我尝试关注但没有成功的一些帖子和网站。

拉取json-api-响应的正确方法

链接2

仅从方法内部导致相同的结果响应。

ios json swift
1个回答
1
投票

问题在于对网络的调用(看起来您正在使用 alamofire)是异步的。因此网络请求已启动,在完成之前,您的

println(resData)

行执行。此时网络的响应尚未返回,因此 resData 仍然是一个空数组。

尝试这样做:

添加新功能

func handleResponse(resData: NSArray) {
    self.resData = resData
    println(resData)
}

然后在响应代码中替换

self.resData = JSON as NSArray

let resData = JSON as NSArray
self.handleResponse(resData)

假设您需要的不仅仅是一个 println 语句来在加载数据时进行更改,您还需要通知表视图或其他 UI 组件之类的东西在此方法中重新加载其数据源。

© www.soinside.com 2019 - 2024. All rights reserved.