实现在Objective-C中链接消息的机制?

Mos*_*she 1 iphone block objective-c ios

我正在编写一个应用程序,需要在另一个方法完成后运行方法.(常见情况,对吧?)

我正在尝试实现链式方法.我想出的最好的就是打电话performSelector:withObject:afterDelay:.我只是不确定这是否是最好的方法.我已经研究了Cocos2d游戏引擎如何实现它的CCSequence类,但我不确定我是否理解它.

我怀疑块在这里会做得很好,除了我不确定如何使用它们作为回调对象或其他什么.

我将如何一个接一个地实现运​​行方法的机制?(我愿意使用定时器或块,但我不知道在这种情况下我是如何使用块的.)

编辑:

为了澄清,我正在尝试实现一个类似cocos2d CCSequence类的系统,它采用一些方法并按顺序"调度"它们.像动画这样的东西,需要花费不止一个时钟周期才能运行.

我不是要阻止主线程,也不想相互硬编码方法.Cocos2d有一个排序系统,我可以将方法传递给队列并按顺序运行它们.

编辑2:

此外,我希望能够取消我的预定队列,所以我不确定GCD是否适合这一点.可以取消GCD串行队列吗?

Cha*_*ran 7

您可以使用线程迁移技术

接下来是一个名为GCD-Grand Central Dispatch的有趣任务

Grand Central Dispatch(GCD)是Apple Inc.开发的一项技术,用于优化具有多核处理器和其他对称多处理系统的系统的应用程序支持.它是基于线程池模式的任务并行的实现.

GCD的工作原理是允许可以并行运行的程序中的特定任务排队等待执行,并根据处理资源的可用性,安排它们在任何可用的处理器核心上执行

Dispatch Queues是维护任务队列的对象,无论是匿名代码块还是函数,并依次执行这些任务.库自动创建多个具有不同优先级的队列,这些队列同时执行多个任务,根据操作环境选择要运行的最佳任务数.库的客户端还可以创建任意数量的串行队列,这些串行队列按照提交的顺序执行任务,一次一个.因为串行队列一次只能运行一个任务,所以提交到队列的每个任务对于队列中的其他任务都是至关重要的,因此可以使用串行队列而不是对竞争资源的锁定.

调度队列与其他调度队列同时执行其任务.任务的序列化仅限于单个调度队列中的任务.

在您的情况下,您可以使用串行调度队列

当您希望任务按特定顺序执行时,串行队列非常有用.串行队列一次只执行一个任务,并始终从队列的头部提取任务.您可以使用串行队列而不是锁来保护共享资源或可变数据结构.与锁不同,串行队列确保以可预测的顺序执行任务.只要您将任务异步提交到串行队列,队列就永远不会死锁.

与为您创建的并发队列不同,您必须显式创建和管理要使用的任何串行队列.您可以为应用程序创建任意数量的串行队列,但应避免创建大量串行队列,以此作为同时执行尽可能多的任务的方法.如果要同时执行大量任务,请将它们提交到其中一个全局并发队列.创建串行队列时,请尝试确定每个队列的用途,例如保护资源或同步应用程序的某些关键行为.

dispatch_queue_t queue;

queue = dispatch_queue_create("com.example.MyQueue", NULL);
Run Code Online (Sandbox Code Playgroud)

此代码显示了创建自定义串行队列所需的步骤.dispatch_queue_create函数有两个参数:队列名称和一组队列属性.调试器和性能工具显示队列名称,以帮助您跟踪任务的执行方式.队列属性保留供将来使用,应为NULL.

Grand Central Dispatch提供的功能允许您从应用程序访问多个常见的调度队列:

使用dispatch_get_current_queue函数进行调试或测试当前队列的标识.从块对象内部调用此函数将返回块已提交到的队列(现在可能正在运行该队列).从块外部调用此函数将返回应用程序的默认并发队列.

使用dispatch_get_main_queue函数获取与应用程序主线程关联的串行调度队列.此队列是为Cocoa应用程序以及在主线程上调用dispatch_main函数或配置运行循环(使用CFRunLoopRef类型或NSRunLoop对象)的应用程序自动创建的.

使用dispatch_get_global_queue函数获取任何共享并发队列.

注意:您无需保留或释放任何全局调度队列,包括并发调度队列或主调度队列.任何保留或释放队列的尝试都将被忽略.

来源:并发编程指南


ser*_*gio 6

使用串行GCD队列怎么样?

私人调度队列

串行队列(也称为专用调度队列)按照将它们添加到队列的顺序一次执行一个任务.当前正在执行的任务在由调度队列管理的不同线程(可能因任务而异)上运行.串行队列通常用于同步对特定资源的访问.您可以根据需要创建任意数量的串行队列,并且每个队列与所有其他队列同时运行.换句话说,如果您创建四个串行队列,则每个队列一次只执行一个任务,但最多可以同时执行四个任务,每个队列一个.有关如何创建串行队列的信息,请参阅"创建串行调度队列".

(来源)

如果您希望在后台线程中处理所有消息,这将非常有用.