在应用程序开发的世界中,性能始终是一个问题。今天,我将向您展示如何轻松地为自定义绘图的应用程序添加性能。
如果你曾经使用过coregaphics API,那么你可能知道绘图工作主要是在CPU上完成的。因为,你的应用程序逻辑的其余部分也将依赖于CPU,你不希望你的UI代码被锁定。
在这三部分系列中,我将向您介绍设置此代码的代码。
第2部分: 使用GCD
第2部分: 使用GCD
对于异步代码,我们将使用GCD (Grand Central Dispatch)。为了使我们的代码干净,我们将设置一些规则。
1.一次只能进行一次绘图操作
2.如果有多个请求进来,而我们正在绘制,我们只使用最后一个进来,并抛出其他。
所以这里是代码:
@ interface SingleDispatchQueue()
{
dispatch_queue_t _masterQueue;
NSInteger _currentlyRunningBlocks;
dispatch_block_t _queuedBlock;
}
@ end
@ implementation SingleDispatchQueue
-(id)init
{
self = [super init];
if(self)
{
masterQueue = dispatch_queue_create(“masterQueue”,DISPATCH_QUEUE_CONCURRENT);
}
返回self;
}
-(void)addBlock 🙁 dispatch_block_t) 块
{
queuedBlock = [块复制];
[自执行 ];
}
-(void) 执行
{
if (_currentlyrunningblocks = = 0 & & _queuedblock!= nil)
{
_currentlyRunningBlocks = 1;
__ block dispatch_block_t c = [_queuedblock copy];;
__ 弱单调度队列 * weakSelf = self;
_queuedBlock = nil;
dispatch_async (_masterquequeue,^
{
c();
dispatch_async(dispatch_get_main_queue(), ^()
{
[weakSelf next];
});
});
}
}
-(无效) 下一个
{
_currentlyrunningblocks = 0;
[自执行 ];
}
@ end
所以,这比我们上一篇文章中的代码多一点。然而,这很简单。
基本上,我们创建了一个名为的新类: SingleDispatchQueue
此类具有单个公共方法,称为addBlock 🙁 dispatch_block_t)block
我们将传入的块排队,然后调用execute方法。在execute方法中,我们检查以确保我们当前没有处于执行块的中间。如果我们是,我们跳过。
现在,如果用户再次调用addBlock,当我们执行时,您会注意到我们用新的块替换了现有的排队块,这就是我们满足上面列出的规则的方式。
那么,代码如何异步运行?这可以追溯到我们的承包商,在那里我们创建了名为masterQueue的dispatch_queue_t。请注意,我们正在使用DISPATCH_QUEUE_CONCURRENT创建队列
然后,我们首先调用dispatch_async,使用我们的masterQueue并创建一个新块。在该块中,我们执行通过addBlock方法提交的块。一旦该代码执行,我们执行另一个dispatchAsync,但这次是在主线程上。所有代码所做的就是在我们的类中执行一个私有方法,该方法再次尝试并调用execute。如果没有剩余的运行,我们退出方法,我们就完成了。
请继续关注第3部分,我们将迄今为止学到的所有内容放在一起!
史蒂芬·扎哈鲁克 (SteveZ)