2017-02-13 4 views
1

Я пытаюсь получить некоторые данные из coreData и отобразить их в коллекцииView. Довольно простой. Я делаю это в фоновом потоке, а затем вызываю reloadData на главном, как видно на изображениях.CollectionView realoadData index out of range

Но проблема в том, что иногда это работает, а иногда и нет, давая мне индекс вне диапазона. И я заметил, что, когда он выходит из строя он входит в некоторый метод делегата зрения сбора и не viewWillAppear

How I call it from ViewWillAppear Fetching data

Edit: Here Is the code

+1

Пожалуйста, вставьте свой код в свой вопрос, а не скриншоты и укажите сообщение об исключении, а какая строка имеет исключение. – Paulw11

+0

обновите свой вопрос с помощью метода делегатов collectionview –

+0

Возможно, вы возвращаете 'collectionViewCell' больше, чем вы dataArray –

ответ

0

Ребята благодарим вас за неприятности, но мне удалось получить то, что я хотел.

Я не решил проблему фона, вместо этого я ее исключил. Все, что я хотел получить, было индикатором активности, когда данные загружались из CoreData.

И, устраняя очереди, это сработало, что довольно логично теперь, когда я думаю, потому что я запускаю анимацию в основном потоке и останавливаю ее после того, как все данные были загружены. Итак, кажется, что основной поток «может делать 2 вещи одновременно»? :)

0

Вы можете иметь более чем одну проблему. Но первым будет то, что вы не инициализировали контейнеры данных. Методы делегатов collectionView будут вызываться перед представлениемWillAppear. Попробуйте ввести контейнеры в ячейку viewDidLoad:

thumbnailsForSections = [String:[Thumbnails]]() 
+0

Если это сработало несколько раз, почему бы вам так? Я инициализирую его, когда я являюсь функцией GetData, которую нужно вызывать каждый раз, когда я вхожу в контроллер перед методами делегата. Но, как говорят люди, это нечто согласное. Я ценю помощь, хотя – Loki

+0

@ user3018285, так как авария произошла до willViewAppear. его наверняка у вас есть проблема с инициализацией, и делегат вызывается перед viewWillAppear. Как я уже сказал, у вас может быть несколько проблем. Это одна из них. Решите это первым, прежде чем идти вперед. – hasan83

0

Основные данные не являются потокобезопасными. Вы не можете сохранить NSManagedObjects, которые были получены из фонового потока и использовать их в основном потоке.

Рассмотрите возможность выполнения выборки по основной теме или с помощью NSFetchedResultsController. Это не должно при нормальных обстоятельствах занимать много времени даже для большого объема данных. Если это займет много времени, подойдите ближе к модели данных или вашему предикату.

Если вы хотите продолжить использовать фоновый поток, вам необходимо скопировать значения, хранящиеся в NSManagedObject, в другой поточно-безопасный объект (то есть пользовательский подкласс NSObject или словарь).

+0

Не могли бы вы указать мне какую-нибудь документацию или пример? Я уверен, что если я попробую это сам, я собираюсь испортить это :) – Loki

+0

Вы можете прочитать документ яблока на получаемом контролере результатов - у них есть хорошее пошаговое руководство - https://developer.apple.com/library /content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html. –

+0

Также похоже, что у вас есть проблема с тем, что вы храните изображения в основных данных - это, как правило, плохая идея, так как она загрузит все данные для всего изображения в память, когда вы сделаете выборку. Что вы можете сделать, так это хранить данные как отношения в отдельном объекте (который не будет загружен до тех пор, пока вы его не получите) и нажмите «разрешить внешнее хранилище», чтобы данные были в отдельных файлах, а не в файле sql. См. Http://stackoverflow.com/questions/16685812/how-to-store-an-image-in-core-data –