0

我正在努力尝试在这里找出一些东西,并且可以使用一些指针。编写具有 Web 视图的应用程序。我希望它从一定距离开始,找到用户位置,然后放大到该点,居中,然后添加地图注释。

我了解这些要求中的每一个的机制,但是在对它们进行排序时遇到问题,以便它们按顺序发生。由于 Obj-C 的并发性,我不能指望在下一个任务开始之前完成一个任务。

我正在寻找允许我完成一项任务的解决方案,完成后,执行下一项,依此类推。我认为这将涉及块,但我只是在学习所有这些,它们让我头晕目眩。

我会很感激任何建议。提前致谢。

4

2 回答 2

8

如果您使用NSOperation和 NSOperationQueues,您可以使每个单独的操作都依赖于必须首先完成的操作。

编辑

这里大致介绍一下操作的使用方法。更多信息可以在并发优先编程指南的操作队列部分找到。我绝对推荐你阅读这篇文章,因为我只会介绍你可以用操作做什么的一小部分。

首先,创建您的操作。您可以创建块操作(在其中提供块)、调用操作(在其中提供 Cocoa 调用),或者您可以自己子类化 NSOperation 类并重写main以完成工作。

假设您选择块操作:

NSBlockOperation op1 = [NSBlockOperation blockOperationWithBlock: 
                          ^{
                               // Do some work.
                          }];
NSBlockOperation op2 = [NSBlockOperation blockOperationWithBlock: 
                          ^{
                               // Do some different work.
                          }];
NSBlockOperation op3 = [NSBlockOperation blockOperationWithBlock: 
                          ^{
                               // Do yet more work.
                          }];

现在,您可以将这些全部放在队列中执行。

NSOperationQueue* opQueue = [[NSOperationQueue alloc] init];
[opQueue addOperation: op1];
[opQueue addOperation: op2];
[opQueue addOperation: op3];

这将运行所有操作,可能并行(取决于可用的系统资源),除非您设置队列的最大并发操作计数。假设 op3 只应在 op1 和 op2 完成后完成。您可以设置依赖关系来建模关系(在将操作放入队列之前!)。

NSOperationQueue* opQueue = [[NSOperationQueue alloc] init];
[op3 addDependency: op1];
[op3 addDependency: op2];
[opQueue addOperation: op1];
[opQueue addOperation: op2];
[opQueue addOperation: op3];

现在 op3 只会在 op1 和 op2 完成后运行。这样做的好处是您设置了依赖关系,然后将所有操作推送到队列中并忘记它们(尽管向 op3 添加完成处理程序以告诉您它们何时完成可能是个好主意)。然后操作系统负责平衡负载与并行化和您定义的顺序。

于 2012-04-18T13:00:54.027 回答
0

我等待某事首先完成的一种方法是将其放入返回 BOOL 的子例程中: -(BOOL)myMethod { // 此处的方法 Return YES; } 然后调用它: If (myMethod) { // 你接下来要做什么 }

于 2012-04-18T12:13:08.373 回答