在iOS中一个接一个地执行方法

在iOS中一个接一个地执行方法,ios,iphone,objective-c,ios7,Ios,Iphone,Objective C,Ios7,在我的应用程序中,我有四种方法,如 - (void)Method1; - (void)Method2; - (void)Method3; - (void)Method4; 我想一个接一个地执行这些方法。我在一些源代码中搜索这个,它们使用“dispatch_Time”,在一些源代码中,它们使用“NSThread sleepForTimeInterval:”但在我的应用程序中,我不想使用Time执行这些方法。如果前一个方法执行完成,我想执行它们。我怎样才能做到这一点呢?在类似这样的地方

在我的应用程序中,我有四种方法,如

- (void)Method1;  
- (void)Method2;  
- (void)Method3;  
- (void)Method4;

我想一个接一个地执行这些方法。我在一些源代码中搜索这个,它们使用“dispatch_Time”,在一些源代码中,它们使用“NSThread sleepForTimeInterval:”但在我的应用程序中,我不想使用Time执行这些方法。如果前一个方法执行完成,我想执行它们。我怎样才能做到这一点呢?

在类似这样的地方调用第一个方法

[self (void)Method1];
并且像这样实现

(void)Method1{

   // logic here 
  [self (void)Method2];
}

(void)Method2{

   // logic here 
  [self (void)Method3];
}

以此类推…………

如果方法在完成工作之前不返回,只需按顺序调用它们:

[self Method1];
[self Method2];
[self Method3];
[self Method4];
否则,您需要使用调度组之类的工具

解决方案概述 正确的方法是将方法排队到串行队列中

串行队列一次执行一个任务,从而确保一个任务只在其所有前置任务执行一次后执行

有几种方法可以实现你的愿望。我将描述其中的两个,一个使用Grand Central Dispatch,另一个使用
NSOperationQueue

中央大调度
  • 在上创建一个队列,您将使任务排队。一个好的做法是将队列保留为实例变量,以便您可以从实例方法访问它(与
    NSOperationQueue
    不同,默认情况下,自定义调度队列默认为串行的,即它们一次执行一个任务):
    
    dispatch\u queue\t my\u queue=dispatch\u queue\u create(“com.suresh.methodsqueue”,NULL);
    self.methods\u queue=我的队列

  • 将方法依次排入指定队列:
    
    dispatch_async(self.methods_queue,^{[someObject method1]});
    dispatch_async(self.methods_queue,^{[someObject method2]});
    dispatch_async(self.methods_queue,^{[someObject method3]});
    dispatch_async(self.methods_queue,^{[someObject method4]});
    

  • 操作队列
  • 初始化队列:
    
    NSOperationQueue*aQueue=[[NSOperationQueue alloc]init];
    self.methods_queue=aQueue;
    

  • 确保队列是串行的:
    
    [self.methods\u queue setMaxConcurrentOperationCount:1]

  • 将方法放入队列中,有几种方法,以下方法需要最少的代码量:
    
    [self.methods_queue addOperationWithBlock:^{[someObject method1]}];
    [self.methods_queue addOperationWithBlock:^{[someObject method2]}];
    [self.methods_queue addOperationWithBlock:^{[someObject method3]}];
    [self.methods_queue addOperationWithBlock:^{[someObject method4]}]


  • 如果你能告诉我你在这些方法中做了什么,那会很有帮助。为什么不使用:
    [self Method1];[自我方法2];[自我方法3];[自我方法4]?他们在后台执行一些工作吗?因为正常代码(即不是在特定线程中编写的)的执行是在主线程中完成的,所以在这种情况下,它都是串行的。所以一个接一个地调用方法应该像Zapko说的那样工作。这里的主要问题是我想在我调用的第二个方法中使用第一个方法的变量值,它将值显示为0。对不起,我有几个问题。如果我想实现以下目标,串行队列并没有解决我的问题:async method2将在async method1完成后执行。它无法实现“promisekit”所做的。