在ViewController

时间:2016-06-16 08:27:11

标签: ios iphone xcode swift

我在ItemsViewController.swift

中遇到代码顺序问题

当我运行我的代码时,它会在我的api返回项目的值之前启动for items循环。这是在行中完成的:self.viewModel/getItemsTwo...因此它认为在循环开始时项目为零,因此它出错:

fatal error: unexpectedly found nil while unwrapping an Optional value

只有在api调用/函数调用填充了项目后才能启动循环?

class ItemsViewController: UIViewController {
  private let viewModel : ItemsViewModel = ItemsViewModel()

  override func viewDidLoad() {
    super.viewDidLoad()



    self.viewModel.getItemsTwo(self.viewModel.getCurrentUser())
    var items =  self.viewModel.items

    for item in items! {
        print(item)
    }
  }
...

viewModel中的getItemsTwo函数在调用时设置viewModel.items变量

编辑1

ItemsViewModel.swift

...
var items : JSON?
...

func getItemsTwo(user: MYUser) {

    let user_id = user.getUserId()
    let url = String(format:"users/%@/items", user_id)
    self.get(url).responseJSON { (response) -> Void in
        let dataExample = response.data
        var newdata = JSON(data: dataExample!)
        self.items = newdata
    }
}
...

编辑2

我正在尝试这样做:

只需将ViewController中的更改为:

即可
var items = self.viewModel.getItemsTwo(self.viewModel.getCurrentUser())

和ViewModel:

func getItemsTwo(user: MYUser) -> JSON {

    let user_id = user.getUserId()
    let url = String(format:"users/%@/items", user_id)
    self.get(url).responseJSON { (response) -> Void in
        let dataExample = response.data
        var newdata = JSON(data: dataExample!)
        self.items = newdata
    }
    return self.items
}

但是返回语句仍然错误,就好像self.items一样。

1 个答案:

答案 0 :(得分:1)

也许你可以扩展你的$('td').children().hide()方法来进行回调关闭,例如:

getItemsTwo

意味着您有一个名为func getItemsTwo(user: MYUser, callback: (items: [JSON])-> Void) 的参数,它是一个闭包函数,返回callback并将Void个数组作为输入参数。

JSON添加到newdata后,您可以像这样调用回调闭包:

self.items

然后,在你的func getItemsTwo(user: MYUser, callback: (items: [JSON])-> Void) { let user_id = user.getUserId() let url = String(format:"users/%@/items", user_id) self.get(url).responseJSON { (response) -> Void in let dataExample = response.data var newdata = JSON(data: dataExample!) self.items = new data //Items are now populated, call callback callback(items: self.items) } } 中你可以说:

ItemsViewController

请注意,如果你添加一个闭包作为最后一个参数,你可以使用一个所谓的“尾随闭包”并将它放在你的函数“外部”或“之后”,如“Swift编程语言”的in this chapter所述

希望对您有所帮助(我没有检查过编译器,因此您可能会遇到一些错误,但是请仔细查看它们确定:))。