如何在目标c中按顺序运行函数

时间:2012-08-25 15:17:13

标签: objective-c ios loops

排队功能有问题。我想运行我的功能,当我的第一个功能完成运行时,我想启动另一个功能。

-(void)firstFunct
{

// sending and getting information from server.
// doing sth and creating data to use in my second function.

} 

我的第二个功能是:

-(void)secondFunct
{
// using data coming from first function

}

我现在正在使用这两个函数

-(void)ThirdFunct
{

   [self firstFunct];

   [self performSelector:@selector(secondFunct) withObject:nil afterDelay:0.5];


}

但是存在一个问题,即此方法不适合使用。我想知道是否有一种有效的方法来一个接一个地运行这些函数。

4 个答案:

答案 0 :(得分:4)

您可以简单地在另一个之后调用一个函数:

- (void) thirdFunct
{
    [self firstFunct];
    [self secondFunct];
}

如果您想在后台运行整个块,而不是阻止UI线程,请使用Grand Central Dispatch:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{
    [self firstFunct];
    [self secondFunct];
});

如果第一个函数包含一些异步调用,那么该调用应提供某种接口来在调用完成后运行代码,如委托调用或完成块。

答案 1 :(得分:4)

嗯,是的,zoul在正常情况下的位置。

但是,您提到涉及服务器。在这种情况下,您可能有异步请求。您要做的是阅读用于发出网络请求的类的文档,并了解它用于在完成时通知您的回调。

答案 2 :(得分:3)

Cocoa提供了很好的并发管理类,如NSOperationNSOperationQueue。您可以使用它们来简化链接异步调用的逻辑,而无需在代码中创建显式连接以在工作2完成后调用方法3,并在工作1完成后调用方法2,依此类推。使用依赖关系管理,您可以轻松指定操作之间的依赖关系。

这是一个如何使用该代码的简单示例。假设您在所有这三种方法中异步下载了一些数据,并且您创建了一个名为NSOperation的{​​{1}}子类。

首先,创建一个DownloadOperation

NSOperationQueue

然后,创建三个下载操作。

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

然后,指定操作之间的依赖关系。依赖关系只是说操作只有在完成所有依赖的操作时才能运行。在您的示例中,依赖项看起来像DownloadOperation *a = [[DownloadOperation alloc] init]; DownloadOperation *b = [[DownloadOperation alloc] init]; DownloadOperation *c = [[DownloadOperation alloc] init]; ,可以分为两个步骤:

c <- b <- a

现在将这些操作添加到队列中。

[b addDependency:a];
[c addDependency:b];

此时队列将自动开始处理所有操作,但由于我们创建了这种链接类型的依赖项,因此它们将在我们的特定示例中依次执行。

我在github上创建了一个示例项目,在https://github.com/AnuragMishra/ChainedOperationQueue上用一个简单的例子演示了它。它通过创建计时器来伪造异步操作,并且当计时器完成时,操作被标记为完成。它是使用Xcode 4.5编写的,所以如果您在旧版本中编译时遇到问题,请告诉我。

答案 3 :(得分:-2)

如果你像这样编写你的方法

-

(void)ThirdFunct
{

   [self firstFunct];

   [self secondFunct];


}
secondFunct之后调用

firstFunct。您的问题肯定来自异步的网络请求。为了确保在异步请求之后执行secondFunct,您必须从委托或阻止执行它。 如果您NSURLConnection

,则结帐NSURLConnectionDelegate