UIManagedDocument вставка объектов в фоновый поток

Это мой первый вопрос о переполнении стека, поэтому, пожалуйста, извините меня, если я нарушаю какой-либо этикет. Я также довольно новичок в создании Objective-C/приложений.

Я следил за курсом CS193P в Стэнфорде, в частности, за лекциями/демонстрациями CoreData. В приложении Photomania Пола Хегарти он начинает с табличного представления и заполняет данные в фоновом режиме, не прерывая поток пользовательского интерфейса. Я создаю приложение, в котором перечислены предприятия в локальной области (из API, возвращающего данные JSON).

Я создал категории в соответствии с уроками фото/фотографии Пола. Создание самих классов не является проблемой, это то, где они создаются.

A simplified data structure:
- Section
    - Sub-section
        - business
        - business
        - business
    - business
    - business
    - business

Мое приложение начинается с UIViewController с несколькими кнопками, каждая из которых открывает представление таблицы для соответствующего раздела (все они работают нормально, я пытаюсь предоставить достаточно информации, чтобы мой вопрос имел смысл). Я вызываю вспомогательный метод для создания/открытия URL-адреса для UIManagedDocument, который был основан на этом вопросе. Это вызывается, как только приложение запускается, и загружается быстро.

У меня есть метод, очень похожий на fetchFlickrDataIntoDocument Пола:

-(void)refreshBusinessesInDocument:(UIManagedDocument *)document
{
dispatch_queue_t refreshBusinessQ = dispatch_queue_create("Refresh Business Listing", NULL);
dispatch_async(refreshBusinessQ, ^{
    // Get latest business listing
    myFunctions *myFunctions = [[myFunctions alloc] init];
    NSArray *businesses = [myFunctions arrayOfBusinesses];

    // Run IN document's thread
    [document.managedObjectContext performBlock:^{

        // Loop through new businesses and insert
        for (NSDictionary *businessData in businesses) {
            [Business businessWithJSONInfo:businessData inManageObjectContext:document.managedObjectContext];
        }

        // Explicitly save the document.
        [document saveToURL:document.fileURL 
           forSaveOperation:UIDocumentSaveForOverwriting
          completionHandler:^(BOOL success){
              if (!success) {
                  NSLog(@"Document save failed");
              }
          }];
        NSLog(@"Inserted Businesses");
    }];
});
dispatch_release(refreshBusinessQ);
}

[myFunctions arrayOfBusinesses] просто анализирует данные JSON и возвращает NSArray, содержащий отдельные предприятия.

Я запустил код с NSLog в начале и в конце кода создания бизнеса. Каждому бизнесу назначается раздел, создание которого занимает 0,006 секунды, и их несколько сотен. Вставка занимает около 2 секунд.

Вспомогательный метод находится здесь:

// The following typedef has been defined in the .h file
// typedef void (^completion_block_t)(UIManagedDocument *document);

@implementation ManagedDocumentHelper

+(void)openDocument:(NSString *)documentName UsingBlock:(completion_block_t)completionBlock
{
    // Get URL for document -> "/"
    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:documentName];

    // Attempt retrieval of existing document
    UIManagedDocument *doc = [managedDocumentDictionary objectForKey:documentName];

    // If no UIManagedDocument, create
    if (!doc) 
    {
        // Create with document at URL
        doc = [[UIManagedDocument alloc] initWithFileURL:url];

        // Save in managedDocumentDictionary
        [managedDocumentDictionary setObject:doc forKey:documentName];
    }

    // If the document exists on disk
    if ([[NSFileManager defaultManager] fileExistsAtPath:[url path]]) 
    {
        [doc openWithCompletionHandler:^(BOOL success)
         {
             // Run completion block
             completionBlock(doc);
         } ];
    }
    else
    {
        // Save temporary document to documents directory
        [doc saveToURL:url 
      forSaveOperation:UIDocumentSaveForCreating 
     completionHandler:^(BOOL success)
         {
             // Run compeltion block
             completionBlock(doc);
         }];
    }
}

И вызывается в viewDidLoad:

if (!self.lgtbDatabase) {
    [ManagedDocumentHelper openDocument:@"DefaultLGTBDatabase" UsingBlock:^(UIManagedDocument *document){
        [self useDocument:document];
    }];
}

useDocument просто устанавливает self.document в предоставленный документ.

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

Будем признательны за любую помощь. Я работал над этой проблемой в течение нескольких дней и не смог ее решить, даже с другими подобными вопросами здесь.Если есть какая-либо другая информация, которая вам требуется, пожалуйста, дайте мне знать!

Спасибо.

РЕДАКТИРОВАТЬ:

Пока этот вопрос получил один голос против. Если есть способ улучшить этот вопрос, или кто-то знает вопрос, который я не смог найти, не могли бы вы прокомментировать, как и где? Если есть другая причина, по которой вы голосуете против, пожалуйста, дайте мне знать, так как я не могу понять негатив и хотел бы узнать, как внести свой вклад лучше.

5
задан Community 23 May 2017 в 11:56
поделиться