2015-04-07 6 views
0

У меня есть приложение, в котором хранятся данные о ресторанах. Их меню, расписание и так далее. Theres ~ 200 ресторанов в БД к настоящему времени. Приложение, используемое для извлечения этих мест одним выстрелом, но для загрузки было слишком много времени, поэтому я решил загрузить данные по одному. В начале приложение запрашивает у сервера массив идентификаторов места, затем получает данные через API.RestKit, основные данные, магическая запись, множество данных и пользовательский интерфейс отладки

Я установил блоки завершения для операций РК в фоновые очереди, но это не помогло. Прокрутки работают не достаточно сглаженно, а иногда и приложение даже взаимоблокировки (sic!) Или сбои без вывода ошибок в консоли. Я пробовал использовать Инструменты, чтобы определить, что делает UI отрывистым, но не удалось. Я даже отключил функции загрузки и сортировки изображений. Раньше у меня были запросы запросов RK, завернутые в @synchronized, поэтому я удалил их, но никакого эффекта.

Никогда не думал, что я столкнулся с такой проблемой после нескольких недель опыта работы с объективом-c. Я пробовал все возможные способы, которые приходили мне на ум, так что теперь я не могу отказаться.

Пожалуйста, помогите мне :)

ниже код вызывается в 200 раз сразу после запуска приложения.

NSURLRequest *request = [[DEAPIService sharedInstance].manager requestWithObject:nil 
                       method:RKRequestMethodGET 
                       path:path 
                      parameters:params]; 
    //DLog(request.URL.absoluteString); 

    NSManagedObjectContext *context = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_contextForCurrentThread]]; 

    RKManagedObjectRequestOperation *operation = [[DEAPIService sharedInstance].manager managedObjectRequestOperationWithRequest:request 
                             managedObjectContext:context 
                                 success:success 
                                 failure:failure]; 

    // dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
    dispatch_queue_t backgroundQueue = dispatch_queue_create("com.name.bgqueue", NULL); 
    operation.successCallbackQueue = backgroundQueue; 

    [[DEAPIService sharedInstance].manager enqueueObjectRequestOperation:operation]; 

Перед этим задаются дескрипторы ответов. А также есть много отношений в БД. Я просмотрел размер файла DB - это ~ 1.5Mb. Интересно, что произойдет, если будет более 1 тыс. Ресторанов. Это хороший способ загрузить такие данные? Каковы наилучшие методы?

+0

Как вы пришли к использованию RK & MR таким образом? – Wain

+0

Есть ли причина, по которой вы используете MR, и причина, по которой вы сами создаете очередь на операцию запроса? – Wain

+0

Я не автор приложения, поэтому я не знаю, почему предыдущий парень сделал это именно так. Я проверил код MR, и он просто инициализирует дочерний контекст с типом параллелизма NSPrivateQueueConcurrencyType. MR используется во всем приложении, я полагаю, что для удобства, например, вы можете получить первый объект в БД одной строкой кода: APPlace * place = [APPlace MR_findFirst]; – Alexander

ответ

1

Хорошо, из предоставленной информации вы должны быть в состоянии упростить многое. На данный момент ваш код падает до низкого уровня и участвует в потоковой обработке и управлении контекстом, которые вы хотите оставить для RestKit для сортировки. У вас есть правильно сконфигурированный диспетчер объектов и основной стек данных с помощью взглядов, поэтому вы должны позволить ему выполнять эту работу.

Это означает удаление кода запроса, контекста и запроса и просто вызов `getObjectsAtPath: parameters: success: failure: '. Затем RestKit будет обрабатывать всю загрузку и сопоставление в фоновом режиме и сохранять контекст.

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

После этого любая блокировка пользовательского интерфейса не связана с RestKit и требованиями к загрузке и должна быть связана с последующим управлением/загрузкой изображений.

+0

Это частично помогло, но все же свиток немного отрывистый. Где еще может быть проблема? Могут ли быть связаны отношения? Один объект Place получил 4 из них.Вот настройка дескриптора ответа: https://gist.github.com/anonymous/846599751c215a49acf5 И у меня есть получаемый контролер результатов, даже если у меня нет того, как он на самом деле загружен в Core Data. Раньше я обновлял пользовательский интерфейс для контента, но его вызывали много раз в секунду, поэтому я удалил ссылку. – Alexander

+0

RK выполняет всю обработку данных в фоновом режиме, поэтому, если вы не запустили CPU, это не вызовет отставание в пользовательском интерфейсе. Вероятно, вы должны задать новый вопрос, который показывает код, который вы должны обновить интерфейс, когда FRC примет изменения. Профилирование также должно помочь вам найти проблему сейчас. – Wain

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

  • Нет связанных вопросов^_^