gpt4 book ai didi

ios - 我应该如何在 iOS 中使用 GCD dispatch_barrier_async(似乎在其他 block 之前而不是之后执行)

转载 作者:技术小花猫 更新时间:2023-10-29 10:06:58 24 4
gpt4 key购买 nike

我正在尝试在 iOS5 中同步以下代码:

  1. 一个对象有一个方法可以发出 HTTP 请求获取一些数据,包括图像的 URL
  2. 数据到达后,文本数据用于填充核心数据模型
  3. 同时,分派(dispatch)第二个线程异步下载图片;当该图像已缓存并在 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
}
});
}

但实际情况是基于屏障的保存 block 始终在图像加载 block 之前执行。也就是说,

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];
});

所以很明显我并没有真正在屏障之前调度图像加载 block ,或者屏障会等到图像加载 block 完成后再执行(这是我的意图)。

我做错了什么?如何确保图像加载 block 在屏障 block 之前排队?

最佳答案

乍一看,问题可能是您在全局并发队列上分派(dispatch)屏障 block 。您只能在自己的自定义并发队列上使用屏障 block 。根据 dispatch_barrier_async 上的 GCD 文档,如果您将一个 block 分派(dispatch)到全局队列,它的行为就像一个普通的 dispatch_async 调用。

Mike Ash 有一篇关于 GCD 障碍 block 的好博文:http://www.mikeash.com/pyblog/friday-qa-2011-10-14-whats-new-in-gcd.html

祝你好运

T

关于ios - 我应该如何在 iOS 中使用 GCD dispatch_barrier_async(似乎在其他 block 之前而不是之后执行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10808476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com