gpt4 book ai didi

ios - 在 block 中修改后未更新 Swift 结构

转载 作者:可可西里 更新时间:2023-11-01 00:37:34 28 4
gpt4 key购买 nike

我正在用 Swift 编写一个 iOS 应用程序,但在结构和 block 方面遇到了一些问题。当用户编辑他的教育信息并单击保存按钮时,我向服务器发送请求并在成功处理程序中更新本地数据。这里我在类EditController中写了一个editItem()函数,在类UserModel结构中写了一个editEducation() :

class EditController: UITableViewController {

//...

func editItem<T>(item: T, completion: () -> Void) {
switch selectedType {
case .Education:
let educationItem = item as! EducationModel
// self.user is a object of type "UserModel"
user!.editEducation(index: selectedRow, educationItem: educationItem) {
// breakpoint 2 here
completion()
self.tableView.reloadData()
}
default:
return
}
}

//...

}

struct UserModel {

//...

var education = [EducationModel]()
//EducationModel is also a structure

//...

mutating func editEducation(#index: Int, educationItem: EducationModel, completion: () -> Void) {
let manager = HTTPClient.sharedManager
manager.POST("/user/education/update",
parameters: [
// params
],
success: { (task, responseObject) in
if responseObject["status"] as! Int == 0 {
self.education[index] = educationItem
// breakpoint 1 here
completion()
} else {
println(responseObject)
}
},
failure: { (task, error) in
println(error)
}
)
}

//...

}

问题是,尽管 self.education 在程序到达断点 1 时成功更新(如上所述),self.user.education 仍然包含旧的断点 2 处的数据。如果我移动

self.education[index] = educationItem

在 POST 请求之外,数据在断点 2 处按预期更新。我尝试通过在断点 2 处添加调度来延迟,但它仍然不会更新。我也打印了相关变量的内存地址,但是没有提供有用的信息。我现在通过向 editEducation 添加一个 controller 参数来处理这个问题,在 EditController 中传递 self 并强制更新 user Controller 的属性。我认为这不是一个合适的解决方案。那么有没有更好的方法来做到这一点?

更新 1

我尝试将 UserModel 变成一个类,它解决了问题,但我不想这样做,因为:首先,如果我将其作为一个类,应用程序其他部分的某些行为可能会变得奇怪,其次我必须将其他数十个模型转为类以确保一致性。

最佳答案

您在这里看到的是值类型(结构)和引用类型(类)之间的区别。您应该阅读 Apple 网站上有关差异的博客文章:https://developer.apple.com/swift/blog/?id=10

基本上,一旦您将一个结构传递到一个 block 中,它就会被复制而不是被引用,因此您正在处理一个全新的副本。通过类(class),您可以获得对原始副本的引用。

关于ios - 在 block 中修改后未更新 Swift 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30888072/

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