Tag: 调度

GCD –不再冻结您的应用程序😎

您是否曾经见过您的应用程序冻结或感觉不舒服? 这样的事情。 我必须告诉你,这不是一个断点,应用程序已完全冻结,我无法按下另一个按钮,我将向您解释原因。 该按钮仅运行以下代码 同样重要的是要注意每个队列都有不同的优先级,如下所示 交互式用户的优先级高于用户实例化的优先级,因此,您需要注意派遣队列需要哪种类型的服务质量。 如您所见,蓝点占主导地位,这是因为🔵蓝点的打印优先级高于🔴红点的队列,计数也很明显,蓝点打印了115点,而红点只打印了115点。 41。 为了避免冻结,我们可以将所有工作负荷放在一个队列中,还可以添加取消流程的功能,因为用户可能希望取消流程并返回到您的应用程序。 代码在哪里? 如果您想自己运行,可以下载此示例的我的仓库! 编码愉快! 🚧 chuynadamas / GCD-BasicExample GCD-BasicExample –使用工作项和调度队列的基本示例 github.com

IOS面试常见问题解答(2018年8月)第3部分

本文包含iOS工程师的近期面试经验,我从应聘者那里收集了问题并与您分享,希望对您有所帮助。 Q1。 以下程序的输出是什么(查找同步/异步) 解: Q2。 以下程序的输出是什么(查找同步/异步) 解: Q3。 以下程序的输出是什么(查找同步/异步), 是否会出现任何错误-编译时或运行时,为什么? 解: 永远不要在主队列上调用同步功能 如果在主队列上调用sync函数,它将阻塞队列,队列将等待任务完成,但是由于队列已停止,任务甚至无法启动,因此该任务将永远无法完成已经被封锁。 这称为死锁 。 Q4。 以下程序的输出是什么(查找同步/异步) 解: Q5。 目标C中iOS应用程序的切入点是什么? Q6。 委托和数据源有什么区别? 解决方案: 理论上 委托和数据源模式在很大程度上是独立的,并且是正交的: 委托模式在Cocoa中非常常见,并允许委托(在OS X 10.6之前实现非正式委托协议的任何实例,或在10.6及更高版本中实现正式委托@protocol的对象)修改对象实例的行为。 通常使用这种模式来代替子类化:不是通过子类化类来改变其行为,而是提供了一个响应适当方法的委托。 使用委托的类在约定的事件中向其委托发送消息。 类和委托之间的API由该类定义,并且每个使用该模式的类都不相同,但是API通常由消息组成,这些消息询问委托人如何处理特定事件。 委托模式优于子类的一个优点是,一个类可以实现多个委托协议,从而使其实例充当多个类的委托。 类似地,一个对象实例可以是多个其他对象的委托(因此,大多数委托API将该对象作为该API中每个消息的第一个参数传递)。 委托模式在其他UI框架中并不常见(尽管Qt确实在其Model / View框架中使用委托模式),并且与本质上是类型函数指针的.Net / CLR委托不同。 数据源模式通常由Cocoa中具有复杂状态数据的NSView子类使用,例如NSBrowser,NSTableView,NSOutlineView等。数据源协议定义了一个API,这些(和其他)类的实例可用于获取API。要在视图中显示的数据。 尽管NSController和Cocoa Bindings体系结构已取代了数据源模式的许多用途,但它仍然很常见且功能非常强大。 像上面描述的委托模式一样,其功能的一部分来自对象,该对象能够充当使用多个数据源的实例(甚至可能具有不同数据源协议的多个类的实例)的数据源。 数据源模式通常在其他UI框架中使用,例如Qt(在Model / View框架中,模型类似于数据源)和WPF / Silverlight(数据源可能更类似于视图模型) )。 几乎: 委托用于类之间的通信,数据源用于提供类的运行时行为。 Q7。 frame和bound之间有什么区别? 解: 希望你喜欢这个解释。 如有其他疑问,请访问-iOS专家系列或访谈系列

iOS开发课程:调度

如何并发执行代码? 如何管理调度工作单位? 让我们在快速指南中使用Dispatch框架创建一个简单的项目! 调度包括语言功能,运行时库和系统增强功能,这些系统功能全面,全面地改进了对macOS,iOS,watchOS和tvOS中多核硬件上的并发代码执行的支持。 BSD子系统,Core Foundation和Cocoa API均已扩展为使用这些增强功能,以帮助系统和您的应用程序更快,更高效地运行,并提高响应速度。 考虑单个应用程序有效地使用多个内核有多么困难,更不用说在具有不同数量计算内核的不同计算机上或在多个应用程序竞争那些内核的环境中进行操作了。 在系统级别运行的GCD可以更好地满足所有正在运行的应用程序的需求,并以平衡的方式将它们与可用的系统资源进行匹配。 阅读有关Apple Developer的更多信息 每个工作项都可以同步或异步执行。 当工作项与sync方法同步执行时,程序将等到执行完成后再返回方法调用。 当使用async方法异步执行工作项时,该方法调用立即返回。 通过同步 / 异步执行在操场上运行以下代码 分派队列可以是串行的 ,以便一次执行一个工作项,也可以是并发的 ,以使工作项按顺序出队,但可以一次全部运行并且可以按任何顺序完成。 串行队列和并发队列均以先进先出(FIFO)顺序处理工作项。 在操场上修改代码,然后再次运行。 现在我们有一个并发队列。 *默认为串行 启动应用程序时,系统会自动创建一个称为main queue的特殊队列 。 排队到主队列中的工作项在应用程序的主线程上顺序执行。 您可以使用main type属性访问主队列。 重要 尝试在主队列上同步执行工作项会导致死锁。 在操场上运行代码。 那演示了如何从background在主队列上执行代码。 除了串行主队列之外,系统还创建了许多全局并发调度队列。 您可以使用global(attributes :)类型方法访问与指定服务质量(QoS)最匹配的全局并发队列。 该代码演示了使用不同qos模式的队列初始化。 工作项使您可以直接配置各个工作单元的属性。 它们还使您可以为各个工作单元着想,以等待其完成,收到有关其完成的通知和/或取消它们的目的。 DispatchWorkItem封装了可以执行的工作。 可以将工作项分派到DispatchQueue和DispatchGroup 。 也可以将DispatchSource设置为DispatchSource事件,注册或取消处理程序。 使用WorkItem管理演示程序在操场上运行代码。 分组块允许聚合同步。 您的应用程序可以提交多个块并跟踪它们何时完成,即使它们可能在不同的队列上运行也是如此。 如果在完成所有指定任务之前无法取得进展,此行为将很有帮助。 DispatchGroup允许工作的聚合同步。 您可以使用它们来提交多个不同的工作项,并跟踪它们的完成时间,即使它们可能在不同的队列中运行。 如果在完成所有指定任务之前无法取得进展,此行为将很有帮助。 你完成了! 拍! 拍! 接下来是什么? […]