Базовый код данных и многопоточность - PullRequest
0 голосов
/ 15 января 2012

Следующий код является частью выборки данных (заполните данные в первый раз) частью моего tableViewController.Я использую NSManagedDocument managedObjectContext, чтобы заполнить (предварительно заполнить) мою базу данных.Источником является массив, который я очищаю из моего файла TXT, который находится непосредственно в папке ресурсов Xcode.После этого создания у меня есть случаи документов, такие как закрытый / открытый и обычный.

Следующий код вводит и корректно извлекает мои данные в таблицу с помощью запроса контроллера полученных результатов.Однако, когда данные загружаются в поток, который предназначен для освобождения пользовательского интерфейса от этого одноразового создания данных (26854 имен объектов) в тяжелой операции атрибута managedObject.name, просмотр таблицы и мой пользовательский интерфейс замораживаются (на 1-15 секунд, чтоя думаю, при заполнении в document.managedObjectContext в первый раз для моей базы данных).

Через 10-15 секунд данные загружаются и отображаются правильно.Однако, когда я останавливаю симулятор и перезапускаю приложение в симуляторе, хотя я сохраняю документ, как показано в приведенном ниже коде, и использую ту же настройку контроллера результатов выборки (и запрашиваю), табличное представление показывает пустое, в этом случае оно является подвижным.(Состояние документа на этом этапе показывает, что открыто и нормально, и путь к файлу один и тот же, я проверил ... Кажется, что ни автосохранение, ни явное сохранение для перезаписи я не использую работу ... Или это что-то еще? Я много чего пробовал, и яСкоро я сойду с ума. Я думаю, что это как-то связано с моей многопоточностью.

self.managedObjectNames - это свойство массива в табличном представлении, и я установил его из файла TXT во время loadView моего табличного представления:

Есть ли кто-нибудь, кто может показать здесь ошибку? Это то, что я даю self.managedObjectNames в методе категории создания сущностей.

Спасибо!

- (void)fetchDataIntoDocument:(UIManagedDocument *)document {

    dispatch_queue_t fetchQ = dispatch_queue_create("Data fetcher", NULL);
    dispatch_async(fetchQ, ^{

            [document.managedObjectContext performBlock:^{
                for (int i = 0; i < 26854; i++) {
                    [managedObject managedObjectWithId:[NSNumber numberWithInt:i] andArray:self.managedObjectNames inManagedObjectContext:document.managedObjectContext];
                }
                // NSLog(@"Save baby!!?");
                [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];
            }];
    });
    dispatch_release(fetchQ);
}

1 Ответ

0 голосов
/ 07 апреля 2012

Причина, по которой ваш пользовательский интерфейс блокируется на 10-15 секунд, заключается в том, что document.managedObjectContext был создан с NSMainQueueConcurrencyType. Это означает, что метод executeBlock: будет выполнен в главной очереди.

Создание fetchQ в вашем коде не имеет причин. У этого была бы причина, если получение данных заняло бы значительное количество времени, но добавление их было бы быстрым (например, создание / изменение только нескольких объектов):

dispatch_async(fetchQ, ^{

    // fetch data here (e.g. fetchAttribute may take few seconds)
    NSString *attribute = fetchAttribute();

    [document.managedObjectContext performBlock:^{
        MyObject *o;
        o = [NSEntityDescription insertNewObjectForEntityForName:@"MyObject"
                                          inManagedObjectContext:document.managedObjectContext];
        o.myAttribute = attribute;
    }];
});

Однако я не знаю ответа на ваш главный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...