在Init函数中创建异步Web请求[Swift]

时间:2015-10-26 19:11:08

标签: arrays json xcode swift asynchronous

我试图从类中返回一些JSON数据" RestApiManger"处理HTTP / JSON请求并将其传递到我的班级" CardList"中的数组中,但我遇到了麻烦。

这是我的CardList类:

class CardList {

    var cards: [Card] = []
    var c = NSMutableArray()
    var items = NSMutableArray()

    static var sharedInstance = CardList()

    //MARK - Initalize
    private init(){

        //Dummy Data
        let helm = Card(name: "Helm of Testing", cost: 10, type: "Equipment", subType: "Head Armor", description: "Some say the Helmet of Testing helps keep it's wearers mind clear.")

        //Add to Array
        let c = [helm]

        //Get API Array
        RestApiManager.sharedInstance.getElements { (json: JSON) in
            let results = json["results"]
            for (_, subJson) in results {
                let card:AnyObject = subJson["card"].object
                self.items.addObject(card)
            }
            print(self.items.count) // <---returns 1 (Web Data)
        }

        print(self.items.count)// <---returns 0 (Nothing)

        //Set to Returnable Array
        self.cards = c.sort { $0.cost < $1.cost }
    }

    //END Class
}

似乎它在初始化之前没有传递给items数组,直到它被调用。它在RestApiBlock内打印数组计数,在块外,它返回0(用箭头查看代码中的注释)。我对斯威夫特有点不熟悉,不确定为什么会这样。

有什么方法可以让我的工作吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

调用您的API管理员:

RestApiManager.sharedInstance.getElements
接受闭包的

立即返回,这意味着代码的执行移动到这一行:

print(self.items.count)
在完成请求的闭包之前调用

。这意味着当您打印其计数时,您的items数组为空,这就是您在那里获得0的原因。

你需要做的是在for循环之后用闭包里面的items数组做你想做的事。