Как мне использовать отправку GCD _барьер _async в iOS (, кажется, выполняется до, а не после других блоков)

Я пытаюсь синхронизировать следующий код в iOS5:

  1. у объекта есть метод, который делает HTTP-запрос, из которого он получает некоторые данные, включая URL-адрес изображения
  2. как только данные поступят,текстовые данные используются для заполнения Модель CoreData
  3. в то же время второй поток отправляется асинхронно для загрузки Изображение; этот поток будет сигнализировать через KVO в viewController, когда изображение уже кэшировано и доступно в модели CoreData.
  4. так как загрузка образа займет какое-то время, сразу возвращаемся объект CoreData, который имеет все атрибуты, кроме изображения для звонящий.
  5. Кроме того, когда второй поток завершает загрузку, модель CoreData можно спасти.

Это (упрощенный )код :

- (void)insideSomeMethod
{
    [SomeHTTPRequest withCompletionHandler:
     ^(id retrievedData) 
     {
         if(!retrievedData)
         {
             handler(nil);
         }

         // Populate CoreData model with retrieved Data...

         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
             NSURL* userImageURL = [NSURL URLWithString:[retrievedData valueForKey:@"imageURL"]];
             aCoreDataNSManagedObject.profileImage = [NSData dataWithContentsOfURL:userImageURL];
         });

         handler(aCoreDataNSManagedObject);
         [self shouldCommitChangesToModel];
     }];
}

- (void)shouldCommitChangesToModel
{
    dispatch_barrier_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSError *error = nil;
        if(![managedObjectContext save:&error]) 
        {
            //  Handle error
        }  
    });
}

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

dispatch_barrier_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            NSError *error = nil;
            if(![managedObjectContext save:&error]) 
            {
                //  Handle error
            }  
        });

Выполняется до:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                 NSURL* userImageURL = [NSURL URLWithString:[retrievedData valueForKey:@"imageURL"]];
                 aCoreDataNSManagedObject.profileImage = [NSData dataWithContentsOfURL:userImageURL];
             });

Так что, очевидно, я на самом деле не отправляю блок загрузки изображения -перед барьером, иначе барьер будет ждать, пока блок загрузки изображения -не будет выполнен, прежде чем выполнять (, что было моим намерением ).

Что я делаю не так? как мне убедиться, что блок загрузки изображения -поставлен в очередь перед блоком барьера?

15
задан SaldaVonSchwartz 30 May 2012 в 00:17
поделиться