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

时间:2015-01-31 06:11:48

标签: ios json api swift

我尝试了很多来自stackoverflow和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,我不介意使用其他方法

这里有一些我试图追随但没有运气的帖子和网站

proper-way-to-pull-json-api-resoponse

link2

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

1 个答案:

答案 0 :(得分: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组件等内容,以便在此方法中重新加载其数据源。