【问题标题】:iOS Swift: order of code execution / asynchronous executioniOS Swift:代码执行顺序/异步执行
【发布时间】:2018-01-28 22:36:28
【问题描述】:

如果我快速运行以下代码,步骤 1.、2.、3. 和 4. 是否总是按此顺序执行(应该如此),或者如果循环,则存在异步执行的风险,排序等花费的时间比预期的要长?

  // 1.
  for i in self.filtered{
      for j in i.calls {
          var jj = j
          jj.uid = i.uid
          self.CallList.append(jj)
      }
  }
  // 2.
  self.CallList.sort { $0.priceHist > $1.priceHist }
  // 3.      
  self.filtered = self.CallList
  // 4.
  self.tableView.reloadData()

【问题讨论】:

  • 您在显示的代码中没有异步执行。这一切都会按顺序执行。顺便说一句,按照惯例,您的数组属性应该是 callList 而不是 CallList
  • 如果您使用异步执行,则只有异步执行的风险。你的问题不是很清楚。如果您发布的代码不使用任何内容,您为什么还要关心异步执行?
  • @Samah 是否为@escaping 并不能确定闭包是否异步执行。
  • 所有的鸭子都是鸟,但不是所有的鸟都是鸭子。确实,异步执行的闭包是转义的,但并不是所有的转义封闭都是异步执行的。
  • 不,这是我的意思。您建议 OP 可能认为传递给 sort 的闭包正在转义,这意味着它是异步执行的。这是一个不正确的逻辑结论,就好像传递给 sort 的闭包是一只鸟,并因此确定它是一只鸭子。

标签: ios swift asynchronous


【解决方案1】:

是的,您可以确定您的代码将按 1、2、3、4 的顺序运行。

您发布的代码中的每一步都是同步执行的。它完成了整个 for 循环,然后是排序,然后分配给过滤的属性,然后告诉表视图重新加载。

执行异步任务的函数是这样记录的。通常此类函数采用完成处理程序,以便您可以在它们完成任务后调用代码。

【讨论】:

  • 谢谢邓肯。我没有意识到只有具有异步属性的特殊函数才能异步执行。你的回答很清楚。