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

时间:2016-03-07 17:50:08

标签: swift completionhandler

如何在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>>]

1 个答案:

答案 0 :(得分:1)

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

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

另一个想法是序列化查询,基本上将循环拉入完成处理程序:只对第一个元素执行查询,并在块中查询下一个元素的数据,依此类推。