0

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

-(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

4 回答 4

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];
});

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

于 2012-08-25T15:20:02.803 回答
4

好吧,是的,佐尔在正常情况下的位置。

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

于 2012-08-25T15:23:56.880 回答
3

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

这是一个如何使用该代码的简单示例。假设您在所有这三个方法中异步下载一些数据,并且您创建了一个NSOperation名为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];

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

[queue addOperations:@[ a, b, c ] waitUntilFinished:NO];

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

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

于 2012-08-26T20:54:08.797 回答
-2

如果你这样写你的方法

-

(void)ThirdFunct
{

   [self firstFunct];

   [self secondFunct];


}

secondFunct之后调用firstFunct。您的问题肯定来自异步的网络请求。为确保您secondFunct在异步请求后执行,您必须从委托或块中执行它。结帐NSURLConnectionDelegate如果你NSURLConnection

于 2012-08-25T15:21:36.450 回答