排队功能有问题。我想运行我的功能,当我的第一个功能完成运行时,我想启动另一个功能。
-(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];
}
但是存在一个问题,即此方法不适合使用。我想知道是否有一种有效的方法来一个接一个地运行这些函数。
答案 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提供了很好的并发管理类,如NSOperation
和NSOperationQueue
。您可以使用它们来简化链接异步调用的逻辑,而无需在代码中创建显式连接以在工作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