For/In 循环中的完成处理程序 - swift

Posted

技术标签:

【中文标题】For/In 循环中的完成处理程序 - swift【英文标题】:Completion handler in For/In loop - swift 【发布时间】:2016-03-07 17:50:08 【问题描述】:

如何在 For/In 循环中实现完成处理程序? 我有两个名为 phonesArray 的 CNLabeledContact 数组:

var myPhoneNumberArray = CNLabeledValue

for item in phonesArray 

   let phonesArrayValue = item.value as! CNPhoneNumber
   let phonesArrayValueDigits = phonesArrayValue.valueForKey("digits")! 
   print("current value: \(phonesArrayValueDigits)") //

   DataService.dataService.checkIfPhoneExistsInDatabase("\(phonesArrayValueDigits)")  (bool) in       
             if bool 
                print("append this item")
                self.myPhoneNumberArray.append(item)
             
             else 
             
     

print("My phonenumbers array is:")
print(myPhoneNumberArray)

这个,运行,打印:

current value: 37439
current value: 78735
My phonenumbers array is:
[]
append this item //Only the second number matches the database and is appenned

我想要:

current value: 37439
Current value: 78735
append this item
[<CNLabeledValue:....digits=78735>>]

【问题讨论】:

我的猜测是checkIfPhoneExistsInDatabase 是异步的,所以直到稍后才会打印结果。如果您希望它正确打印,请将print("current value: \(phonesArrayValueDigits)") 移动到if bool 的正上方。 你说得对,但我的问题过于简化了。我要编辑我的问题。 【参考方案1】:

看起来checkIfPhoneExistsInDatabase 正在执行异步工作。因此,您的其余代码可以在完成处理程序之前、之后或之间的任何时间运行。

因此,如果您的 DataService 实例不提供同步操作或某些同步,则您必须在完成块中手动完成该工作。您的主要兴趣点是检查是否所有项目都已处理。小心比赛条件。

另一个想法是序列化查询,基本上将循环拉入完成处理程序:只需对第一个元素进行查询,然后在块内查询下一个元素的数据等等。

【讨论】:

以上是关于For/In 循环中的完成处理程序 - swift的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift 如何为 For 循环 SKAction 使用完成处理程序

Swift 中的完成处理程序错误

swift 4中的完成处理程序

完成处理程序中的 Swift 泛型

Swift 中的完成处理程序 Firebase 观察者

swift 3 和 Xcode 8 中的完成处理程序错误