【发布时间】:2015-06-03 14:14:20
【问题描述】:
使用这个有什么区别吗(这里的代码仅供测试):
dispatch_async(dispatch_get_main_queue(), ^{
[self.progressBar setProgress:progressValue];
});
而不是这个:
[[NSOperationQueue mainQueue] addOperationWithBlock:^
{
[self.progressBar setProgress:progressValue];
}];
我在这种情况下使用上面的代码:
NSOperationQueue *progressQueue = [[NSOperationQueue alloc] init];
[progressQueue addOperationWithBlock:^{
for (int i = 1; i <= 10; i++) {
sleep(1);
float progressValue = (float)i/10.0;
/* GCD
dispatch_async(dispatch_get_main_queue(), ^{
[self.progressBar setProgress:progressValue];
});
*/
/* Does this have the same effect as using GCD from above
[[NSOperationQueue mainQueue] addOperationWithBlock:^
{
[self.progressBar setProgress:progressValue];
}];
*/
}
}];
【问题讨论】:
-
在你的情况下,我会使用 GCD。 NSOperation 有一些特性:它们可以被取消并具有依赖关系。 GCD 可用于处理文件和内存块。您需要根据您正在尝试解决的任务做出决定。
-
@Cy-4AH 感谢您的回复,我会记住这一点。是的,我有点意识到 NSOperation 在使用线程时提供了更高级别的抽象,并且它具有很好的小功能(GCD 没有),比如从队列中取消操作。但是,我感兴趣的是这两个示例是否完成了完全相同的任务?
-
NSOperation 是一个可可对象,而不是 GCD 不是。仅当您无法使用 GCD 做您想做的事情时才使用 NSOperation
-
@thedjnivek 谢谢,我明白你和 Cy-4AH 所指出的。另外我没有考虑可能的开销,而是这两种技术的影响(更新进度条)......这只是为了学习目的,以更好地理解 NSOperation......我会按照建议坚持 GCD因为我认为我可以做任何事情(我正在尝试在 SpriteKit 中实现自定义进度条)。
-
实际上这不是那个问题的重复,因为我的问题是基于我的特定示例,而不是 GCD 与 NSOperation 的一般... ;)
标签: ios objective-c grand-central-dispatch nsoperation