2016-09-14 50 views
0

由于某些原因,尽管进行了所有检查,但此循环给了我一个空数组消息上的索引越界错误。我知道索引不是越界,因为我设置了if语句来检查它,但它仍然崩溃。另外,当我编辑代码以获得显式索引时,例如数组[0] ....应用程序不会崩溃,如果数组为空,则无意义。任何想法可能导致这种情况?ios:非空数组上的索引超出范围错误

至于为什么我用了一段时间,而不是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

请修改您的问题以在实际问题中包含代码* – Paulw11

+0

该数组是否具有超过8个元素用于此self.representives [8]'不会崩溃? –

+0

它有9个元素,所以放8不会使它崩溃。 –

回答

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是在异步API中的完成处理程序。它被推迟;其余的代码并不等待它,而是其余的代码立即执行,然后当事情准备就绪时,完成处理程序开始发挥作用。

这很可能是因为你对index是什么造成的假设,以及事件发生的顺序,甚至完成处理程序的哪个迭代正在以什么顺序发生,这是错误的。

+0

我应该在主线程上运行代码吗?我觉得这不是正确的举措,但我没有想法。感谢您的回应。 –

+0

@BobFlanders - 在'if'语句中有一个局部变量,它是'index'的当前值。然后在你的完成处理程序中使用这个新的局部变量。 – Rob

+0

你当然不应该在异步代码运行时阻塞;这与做什么完全相反。在我看来,你不应该像这样构造代码。当你有异步操作执行时,你不能简单地循环。您可以启动下一个过程作为最后完成处理程序的最后一步。你可以排队一些NSOperations。你可以做一些不依赖于循环的东西。 – matt

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