出于某种原因,尽管进行了所有检查,但这个循环在空数组消息上给出了一个索引超出范围的错误。我知道索引没有超出范围,因为我设置if语句来检查它,但它仍然崩溃。此外,当我编辑代码以具有显式索引时,例如array [0] ....应用程序不会崩溃,如果数组为空则没有意义。可能导致这种情况的任何想法?
至于为什么我使用了一段时间而不是for for循环数组,for for导致了同样的问题所以我想明确地自己做索引,它仍然会崩溃应用程序。
while(index < self.representatives.count - 1){
if(self.representatives.count > 0){
self.api.getPoliticianContactInfo(self.representatives[8].candidateId!, completion: { (result, id) in
print(result[0].value
print(id)
print("The index is: \(index)")
self.representatives[index].contactInfo = result
self.api.getPoliticianPhoto(id, completion: { (image) in
self.representatives[index].photo = image
print(self.representatives[index].photo)
})
}
index+=1
}
答案 0 :(得分:0)
让我们记住事件发生的顺序。这是代码的结构:
while(index < self.representatives.count - 1){ // (1)
if(self.representatives.count > 0){
self.api.getPoliticianContactInfo(self.representatives[8].candidateId!, completion: { (result, id) in
// completion handler // (3)
})
}
index+=1 // (2)
}
我对关键阶段进行了编号。所以循环运行:我的数字是1,2,1,2,1,2 ......直到索引达到上限。然后,只有到那时,我们才开始通过循环中的每个传递3,3,3,3,3。
这是因为3是异步API中的完成处理程序。它推迟了;其余的代码不会等待它,而是代码的其余部分立即执行,然后,当事情准备就绪时,完成处理程序就会起作用。
这很可能导致你对index
是什么,以及发生了什么顺序的假设,甚至完成处理程序的哪个迭代以什么顺序发生,都是错误的。
答案 1 :(得分:0)
在这种情况下不需要使用索引,并且您的代码异步执行并且您已经对数组的大小做出假设这一事实也无济于事。
您可以在representatives
数组中使用枚举:
for representative in self.representatives {
if let candidateId = representative.candidateId {
self.api.getPoliticianContactInfo(candidateId, completion: { (result, id) in
if !result.isEmpty {
print(result[0].value)
print(id)
representive.contactInfo = result
self.api.getPoliticianPhoto(id, completion: { (image) in
representative.photo = image
print(representatives.photo)
})
}
})
}
}
请注意,网络操作仍将异步执行,因此在循环完成后,representatives
数组将不会立即使用您提取的数据进行更新。
如果您需要在网络操作完成后执行某些代码,那么您可以使用dispatch_group
。