2016-09-14 46 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