我正在努力尝试在这里找出一些东西,并且可以使用一些指针。编写具有 Web 视图的应用程序。我希望它从一定距离开始,找到用户位置,然后放大到该点,居中,然后添加地图注释。
我了解这些要求中的每一个的机制,但是在对它们进行排序时遇到问题,以便它们按顺序发生。由于 Obj-C 的并发性,我不能指望在下一个任务开始之前完成一个任务。
我正在寻找允许我完成一项任务的解决方案,完成后,执行下一项,依此类推。我认为这将涉及块,但我只是在学习所有这些,它们让我头晕目眩。
我会很感激任何建议。提前致谢。
我正在努力尝试在这里找出一些东西,并且可以使用一些指针。编写具有 Web 视图的应用程序。我希望它从一定距离开始,找到用户位置,然后放大到该点,居中,然后添加地图注释。
我了解这些要求中的每一个的机制,但是在对它们进行排序时遇到问题,以便它们按顺序发生。由于 Obj-C 的并发性,我不能指望在下一个任务开始之前完成一个任务。
我正在寻找允许我完成一项任务的解决方案,完成后,执行下一项,依此类推。我认为这将涉及块,但我只是在学习所有这些,它们让我头晕目眩。
我会很感激任何建议。提前致谢。
如果您使用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 添加完成处理程序以告诉您它们何时完成可能是个好主意)。然后操作系统负责平衡负载与并行化和您定义的顺序。
我等待某事首先完成的一种方法是将其放入返回 BOOL 的子例程中: -(BOOL)myMethod { // 此处的方法 Return YES; } 然后调用它: If (myMethod) { // 你接下来要做什么 }