2016-07-06 1 views
2

Я изо всех сил пытаюсь разгадать ошибку EXEC_BAD_ACCESS, которую я получаю. Код выглядит следующим образом:EXEC_BAD_ACCESS заполняет содержимое ячейки в dispatch_async

// Update the cell 
dispatch_async(dispatch_get_main_queue(), { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("customCell", forIndexPath: indexPath) as! CustomCollectionViewCell // crash here 
    cell.image.image = image 
    if(collectionView.numberOfItemsInSection(0) > indexPath.row) { 
     self.collectionView.reloadData() 
    }    
}) 

код предназначен для асинхронного заполнения изображения в collectionViewCell после получения ответа от NSURLSession.dataTaskWithRequest.

Крушение происходит на линии let cell =, потому что (я считаю) indexPath больше не существует (потому что я изменил содержимое в коллекцииView). Я не уверен, как это проверить.

Я думал, что что-то вроде линий if let cell = будет работать, но я думаю, что неправильно понял, как это работает. И, читая другие сообщения, я вижу, что вы не можете поместить код в блок try/catch.

Любые идеи? Спасибо заранее!

+0

Вы делаете это в 'cellForRow ...'? вы должны сделать это там – tbilopavlovic

+0

Да - это лишь небольшая часть этого. Идея состоит в том, что строки будут отображаться, а затем изображения в них будут асинхронно заполняться, так что прокрутка и т. Д. Будет гладкой. – Ben

+0

ОК, но почему вы делаете это внутри: 'let cell = ....'? – tbilopavlovic

ответ

2

collectionView.dequeueReusableCellWithReuseIdentifier используется для повторного использования ячеек в func collectionView(_ collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell вместо их создания вручную. Здесь вы хотите извлечь ячейку, чтобы не использовать ее повторно, поэтому вы должны использовать: cellForItemAtIndexPath(_ indexPath: NSIndexPath).

+0

Сортировка - 'if let cell = collectionView.cellForItemAtIndexPath (indexPath) как? RewardCollectionViewCell {'- спасибо за вашу помощь! – Ben

Смежные вопросы