【发布时间】:2019-01-12 17:31:18
【问题描述】:
我正在制作一个应用程序,我需要从可以随时更改的数组中获取数据。
例如数组:
posts_data: {
["id": 1, "text": "Hello"],
["id": 4, "text": "Good morning"],
["id": 6, "text": "Test"]
}
假设我需要更改post 1 的文本,但我不知道它的索引。然后过一段时间我需要再次更改它,但帖子可能处于不同的位置。
函数 doSomeThing() :
if let index = posts_data.index(where: { $0.id == 1 }) {
posts_data[index].text = "NEW TEXT"
dispatchQueue.global().async {
// Do something async, then I need to change the text again
// But I need to search for the index again
// Because the data source might changed meanwhile
if let index2 = posts_data.index(where: { $0.id == 1 }) {
posts_data[index2].text = "AGAIN"
posts_data[index2].text = "AND AGAIN"
}
}
}
这有点过于复杂了。我想出了以下想法:将搜索放在自定义类中,如果通过 id 找到则返回帖子:
class MainViewController : UIViewController {
...
func doSomeThing(){
if PostsClass.shared.getPost(id: 1) == nil {
return // Just in case if not found
}
PostsClass.shared.getPost(id: 1).text = "NEW TEXT"
dispatchQueue.global().async {
// Bla bla
PostsClass.shared.getPost(id: 1).text = "AGAIN"
PostsClass.shared.getPost(id: 1).text = "AND AGAIN"
}
}
}
class PostsClass {
static let shared = PostsClass()
func getPost(id: Int) -> Post? {
if let index = posts_data.index(where: { $0.id == id }) {
return posts_data[index]
}
return nil
}
}
这是更好还是坏主意?或者还有比这更简单的方法吗?
【问题讨论】:
-
不清楚,
post_data(Post)的Element类型是引用类型还是值类型?你的尝试取决于它。另外,Swift 数组或字典不是线程安全的,当您从多个线程访问单个数组(或字典)时,您可能需要某种排除控制。