Я думаю, я мог это заметить.
Вы выполняете свой запрос, чтобы получить объекты и поместить их в массив результатов.Это запрос номер 1, и он хорошо оптимизирован (при условии, что нет никаких объединений и т. Д., Но он не выглядит таковым)
Затем вы просматриваете все результаты, чтобы удалить дубликаты, которые уже есть в ваших результатах.Это означает, что вы выполняете новый запрос для получения каждого Station NSManagedObject.Если вы хотите избежать дубликатов, вам придется делать это без вызова objectWithID
, поскольку это приведет к извлечению объекта из CoreData.
В худшем случае, чтобы получить результаты по 20 станциям, вам нужно 21 запрос.Не хорошо.
Поскольку sqlite3 является однопоточным, почему бы вам просто не сделать большой предикат вместо 4 меньших - тогда вы можете удалить свои дубликаты в предикате, и вам не нужно будет проходить через массивпока не пришло время нарисовать ячейку табличного представления этой станции.
У меня раньше была эта проблема с поисками, и мне пришлось ее решать, создавая отдельную таблицу в базе данных.В вашем случае эта таблица (называемая station_search) будет содержать только название станции (которая, конечно, будет проиндексирована) и идентификатор станции.Затем я выполняю поиск по этой таблице (что будет быстро, потому что в ней не так много данных для поиска).
Как только я получу свои результаты, я просто использую stationId, чтобы получить Station из таблицы основных станций только тогда, когда мне это нужно т.е. я рисую ячейку в таблице.
Я также могу использовать NSFetchedResultsController , чтобы объединить мои результаты.
Это превратилось в небольшую шумиху - если у вас есть какие-либо вопросы, просто задавайте!
Надеюсь, это поможет,
Сэм