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的主要内容,如果未能解决你的问题,请参考以下文章