gpt4 book ai didi

ios - 在 ViewController 中设置变量之前执行 ViewModel 函数

转载 作者:行者123 更新时间:2023-11-29 00:53:34 25 4
gpt4 key购买 nike

我在 ItemsViewController.swift 中遇到代码顺序问题

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

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
}

但是 return 语句仍然错误,就像 self.items 为 nil 一样。

最佳答案

也许您可以扩展您的 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 中,您可以说:

override func viewDidLoad() {
super.viewDidLoad()
self.viewModel.getItemsTwo(self.viewModel.getCurrentUser()) { items in
for item in items {
print(item)
}
}
}

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

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

关于ios - 在 ViewController 中设置变量之前执行 ViewModel 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37853793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com