gpt4 book ai didi

ios - Swift 闭包和执行顺序

转载 作者:行者123 更新时间:2023-11-28 13:56:21 31 4
gpt4 key购买 nike

我在尝试使用 Swift 创建一个用于我自己的教育目的的应用程序时遇到了一些困难。

现在我有以下(期望的)执行顺序:

  1. 标签 View
  2. FirstViewController - TableView
  3. 检查 CoreData
    • 如果数据存在,使用闭包更新数组
    • 如果数据不存在,则使用 Alamofire 从 API 下载它并将其存储到 Core Data
  4. SecondViewController - CollectionView
    • 检查 Core Data 中是否存在图像数据,如果存在,则从那里加载,否则下载。

我最纠结的问题是要知道闭包之后的代码是在闭包结束后(同步地)执行,还是可能在闭包执行之前或同时执行。

例如:

FirstViewController

var response: [DDGCharacter]
//coreData is an instance of such class
coreData.load(onFinish: { response in //Custom method in another class
print("Finished loading")
self.response = response
})

print("Executed after loading data from Core Data")
//If no data is saved, download from API
if response.count == 0 {
//Download from API
}

我在 10 次运行中完成了上述测试,结果相同:

Finished loading
Executed after loading data from Core Data

总共 10 个,但这可能是因为加载没有花费太多时间来完成,因此看起来是同步的,但实际上不是。

所以我的问题是,它是否会始终以独立于数据量的顺序执行?或者它可能会改变?我也做了一些调试,它们都在主线程上执行。我只是想确定我的假设是正确的。

根据评论中的要求,这是在 load() 方法中完成的实现:

func load(onFinish: ([DDGCharacter]) -> ()) {
var characters: [DDGCharacter] = []

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}

let managedContext = appDelegate.persistentContainer.viewContext

let fetchRequest = NSFetchRequest<NSManagedObject> (entityName: "DDGCharacter")

do {
characters = try managedContext.fetch(fetchRequest) as! [DDGCharacter]
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}

onFinish(characters)
}

最佳答案

您对 load(onFinish:) 的实现非常令人惊讶且过于复杂。不过,幸运的是,这有助于证明您要问的要点。

闭包在调用时执行。所以在你的情况下, onFinish 在方法结束时被调用,这使得它同步。成为“闭包”不会使任何事情变得异步。这与调用函数一样。多次调用闭包是完全正常的(例如 map 就是这样做的)。或者它可能永远不会被调用。或者它可能被异步调用。从根本上说,这就像传递函数一样。

当我说“它与匿名函数略有不同”时,我指的只是“闭包”的“关闭”部分。闭包“关闭”当前环境。这意味着它捕获在闭包内引用的局部范围内的变量。这与函数略有不同(虽然它更多地是关于语法而不是真正深入的东西;在某些情况下函数实际上可以变成闭包)。

在这种情况下,更好的实现只是返回数组。

关于ios - Swift 闭包和执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53841272/

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