2016-03-07 54 views
2

如何在For/In循环中实现完成处理程序? 我有两个CNLabeledContact的阵列称为phonesArrayFor/In循环中的完成处理程序 - swift

变种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

我的猜测是'checkIfPhoneExistsInDatabase'是异步的,所以直到后来才打印结果。如果你想正确打印,请将'print(“当前值:\(phonesArrayValueDigits)”)'移到'if bool {'上方。 – erdekhayser

+0

你是对的,但我简化了我的问题太多。我将编辑我的问题。 – standousset

回答

1

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

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

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