iOS中的操作和操作队列基础

每天,我们的应用程序必须执行越来越多的复杂任务,而又不影响其响应能力。 因此,我们需要知道如何充分利用设备内部等待的电源。 我们可以通过使用Grand Central Dispatch或Operations来利用并发性。 今天我们将讨论运营。

在上面的图表中,我们有一个向操作队列添加优先级不同的多个流程的示例。 如我们所见,具有更高优先级的任务执行得更快。 我们可以通过设置队列的maxConcurrentOperationCount属性来限制队列中同时执行的操作数。 例如,使其等于1将使队列序列化。 还有一个选项可以使队列等待其所有操作完成,但是请记住,它将阻塞当前线程。

如果我们想取消当前在操作队列中的所有任务,可以通过调用其cancelAllOperations()方法来取消。 此方法是为什么我们在开始操作之前检查操作是否未取消的原因,因为在某些情况下它可能正在队列中等待其轮换,但甚至在启动之前就被取消了。 我们还可以选择暂停队列,以阻止它启动任何排队的操作,但是已经执行的操作将继续这样做。 即使我们的操作队列被挂起,我们也可以继续向其添加新操作,但是在将其isSuspended属性设置为false之前,它不会启动任何操作。

服务质量

通过使用qualityOfService,我们确定哪个对象将更快地访问资源,例如网络,CPU时间,磁盘资源等。 我们可以为某个操作对象或整个操作队列设置服务质量。 如果操作已设置其qualityOfService属性,则将使用它代替队列的qualityOfService。

我们可以选择以下五个选项之一:

用于必须尽快提供给用户的内容,例如绘制屏幕或处理控制事件

2.用户发起

用于用户要求的工作,例如,在用户在配方列表中选择配方后加载配方。

3.实用程序

用于用户愿意等待更长的时间的工作,例如导出批量文件。

4.背景

用于用户不可见的工作-与远程数据库同步或预取内容。

5.默认

这是将分配给我们没有分配qualityOfService的对象的对象-但在我们的情况下这不会发生,因为Operation和Operation Queue都具有默认的后台qualityOfService。

为我们的操作或操作队列应该执行的工作选择正确的qualityOfService很重要,因为这可能会产生积极或消极的影响。 如果我们正在执行一些对用户来说很重要的资源密集型操作,则需要选择“用户启动”,但是这样做对于不重要的操作来说是因为我们觉得这样做可能只会浪费电池。

摘要

并发编程并不容易,但是使用合适的工具(例如Operations),我们可以很好地利用它,而不必过多担心幕后发生的所有细节。 现在我们已经了解了操作的基础知识,我们将能够在下一篇文章中处理更复杂(更有趣)的案例!

StanisławPaśkowski是inFullMobile的iOS开发人员, inFullMobile是位于波兰华沙的国际数字产品设计和开发工作室。

随时联系我们:hello@infullmobile.com


最初于 2018 年3月9日 发布在 blog.infullmobile.com 上。