Я пытаюсь синхронизировать следующий код в iOS5:
- у объекта есть метод, который делает HTTP-запрос, из которого он получает некоторые данные, включая URL-адрес изображения
- после поступления данных, текстовые данные используются для заполнения Модель CoreDatali >
- в то же время второй поток отправляется async для загрузки изображение; этот поток будет подавать сигнал через KVO в viewController, когда изображение уже кэшировано и доступно в модели CoreData.
- так как загрузка изображения займет некоторое время, мы сразу возвращаемся объект CoreData, который имеет все атрибуты, но для изображения вызывающий.
- Кроме того, когда загружается второй поток, модель 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];
});
Итак, я действительно не отправляю блок загрузки изображения перед барьером, или барьер будет ждать, пока блок загрузки изображения не будет выполнен (что было моим намерением).
Что я делаю неправильно? как я могу убедиться, что блок загрузки изображения находится в очереди перед барьерным блоком?