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

Iphone 在Objective-C中实现链接消息的机制?,iphone,objective-c,ios,block,Iphone,Objective C,Ios,Block,我正在编写一个应用程序,它需要在另一个方法完成后运行一个方法。(常见场景,对吗?) 我正在尝试实现链式方法。我想到的最好办法是调用performSelector:withObject:afterDelay:。我只是不确定这是不是最好的方法。我已经研究了Cocos2d游戏引擎如何实现其CCSequence类,但我不确定我是否理解它 我怀疑块在这里会做得很好,只是我不知道如何将它们用作回调对象或其他什么 我如何实现一种机制来一个接一个地运行方法?(我愿意使用计时器或块,但我不知道在这种情况下如何使用

我正在编写一个应用程序,它需要在另一个方法完成后运行一个方法。(常见场景,对吗?)

我正在尝试实现链式方法。我想到的最好办法是调用
performSelector:withObject:afterDelay:
。我只是不确定这是不是最好的方法。我已经研究了Cocos2d游戏引擎如何实现其
CCSequence
类,但我不确定我是否理解它

我怀疑块在这里会做得很好,只是我不知道如何将它们用作回调对象或其他什么

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

编辑:

为了澄清这一点,我正在尝试实现一个类似cocos2d的
CCSequence
类的系统,它采用一些方法并按顺序“分派”它们。像动画之类的东西,它的运行时间远远超过一个时钟周期

我不想阻塞主线程,也不想将方法硬编码到彼此之间。Cocos2d有一个排序系统,我可以将方法传递给队列并按顺序运行它们

编辑2:


另外,我希望能够取消预定的队列,因此我不确定GCD是否与此匹配。可以取消GCD串行队列吗?

有两种PerformSelect方法可以等待完成,无需猜测时间

[self performSelector:<#(SEL)#> onThread:<#(NSThread *)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];

[self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];
[自执行选择器:onThread:withObject:waitUntilDone:];
[self-performSelectorOnMainThread:withObject:waitUntilDone:];

有两种PerformSelect方法可以等待完成,无需猜测时间

[self performSelector:<#(SEL)#> onThread:<#(NSThread *)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];

[self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];
[自执行选择器:onThread:withObject:waitUntilDone:];
[self-performSelectorOnMainThread:withObject:waitUntilDone:];

使用串行GCD队列怎么样

专用调度队列

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

()


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

使用串行GCD队列如何

专用调度队列

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

()


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

您可以使用

接下来是一项有趣的任务,名为《GCD中央大调度》

Grand Central Dispatch(GCD)是苹果公司开发的一项技术。 为具有多核处理器的系统优化应用程序支持 和其他对称多处理系统。它是 基于线程池模式的任务并行性

GCD的工作原理是允许程序中的特定任务可以在 并行程序将排队等待执行,具体取决于可用性 处理资源,将它们调度为在任何 可用处理器内核

调度队列是维护任务队列(匿名代码块或函数)的对象,并以其各自的方式执行这些任务 转动库自动创建多个具有不同队列的队列 同时执行多个任务的优先级,选择 根据操作环境运行的最佳任务数。A. 库的客户端也可以创建任意数量的串行队列, 按提交顺序执行任务,一次一个。 由于串行队列一次只能运行一个任务,因此每个任务 提交到队列对于上的其他任务至关重要 队列,因此可以使用串行队列来代替 争夺资源

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

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

当您希望在一个队列中执行任务时,串行队列非常有用 具体顺序。串行队列一次只执行一个任务,并且 始终从队列的最前面提取任务。你可以用连载 队列而不是锁以保护共享资源或可变数据 结构。与锁不同,串行队列确保任务 以可预测的顺序执行。只要你提交你的任务 异步连接到串行队列,队列永远不会死锁

与为您创建的并发队列不同,您必须 显式创建
- (void) performSomeActionWithCompletion:(void (^)()) completion{

     [self someAction];

     if(completion()){
       completion(); 
     }

}
[self performSomeActionWithCompletion:^{
  NSLog(@"All done! (Well, not the async stuff, but at any rate...)");
}];