gpt4 book ai didi

objective-c - 哪个更容易使用? GCD 还是 NSOperation?

转载 作者:太空狗 更新时间:2023-10-30 03:49:00 25 4
gpt4 key购买 nike

我目前正在使用 GCD。但是,我听说 NSOperation 实际上是一个更高级别的程序。不过要复杂得多。

在 GCD 中,在后台做一些事情就是简单地使用我创建的这个辅助函数:

+(void)doForeGround:(void (^)())block
{
dispatch_async(dispatch_get_main_queue(), ^{
block();
});
}

+(void)doBackground:(void (^)())block
{

//DISPATCH_QUEUE_PRIORITY_HIGH
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0), ^{
//dispatch_async(dispatch_get_global_queue(-2,0), ^{
block();
});
}

-(void)doBackGround:(void (^)())block onComletion:(void (^)())onCompletion
{
[BGHPTools doBackground:^{
block();
[BGHPTools doForeGround:^{
onCompletion();
}];
}];
}

使用 NSOperation 会更简单吗?

我错过了什么吗?我如何在 NSoperation 做同样的事情?

最佳答案

您可以使用 NSOperation 执行与使用 GCD 类似的操作。主要区别在于 NSOperation 提供了额外的功能。

例如:

  • NSOperation 有一个 -cancel 方法。调度队列没有取消的概念;队列中排队的所有 block 都将运行完成。
  • NSOperationQueue 有一个 maximumConcurrentOperationCount 属性,您可以使用它(例如)一次只允许 3 个操作运行。调度队列没有这样的概念;它们要么是串行的,一次只允许 1 个 block ,要么是并发的,允许 libdispatch 根据 CPU 使用率和可用性认为合适的数量。
  • NSOperation 可以依赖于其他 NSOperation,允许您推迟执行特定操作,直到它的所有依赖项都已运行。当依赖操作正在等待时,其他操作将被允许在队列中“向前跳转”。调度队列总是按照严格的 FIFO 顺序出队。 (您可以使用 dispatch_group API 在某种程度上模仿依赖关系,但这实际上是针对不同类型的问题。)

现在,如果您不使用这些功能中的任何一个,GCD 也能正常工作。使用 GCD 本身没有什么错误。只是 NSOperation 为一些额外的好特性提供了一个方便的包装器。

下面是如何使用 NSOperationQueue 重写上面的示例:

+(void)doForeground:(void (^)())block
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"I'm running on the main thread!");
block();
}];
}

+(void)doBackground:(void (^)())block
{
// Note; rather than allocating a new NSOperationQueue every time, you could
// allocate the queue once and just refer to that queue. For simplicity, I'll
// skip that here.
[[NSOperationQueue new] addOperationWithBlock:^{
NSLog(@"I'm running asynchronously on whatever thread NSOperationQueue wants!");
block();
}];
}

-(void)doBackground:(void (^)())block onCompletion:(void (^)())onCompletion
{
[[NSOperationQueue new] addOperationWithBlock:^{
block();
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
onCompletion();
}];
}];
}

关于objective-c - 哪个更容易使用? GCD 还是 NSOperation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966506/

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