如何在Objective-C/iOS中可靠地排序命令

jam*_*rns 0 objective-c ios objective-c-blocks

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

我理解每个要求的机制,但是对它们进行排序时遇到问题,以便它们按顺序发生.由于Obj-C的并发性,我不能依赖于下一次启动之前完成的任务.

我正在寻找能让我完成一项任务的解决方案,完成后再做,等等.我认为这将涉及块,但我只是学习这一切,他们让我头晕目眩.

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

Jer*_*myP 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.
                          }];
Run Code Online (Sandbox Code Playgroud)

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

NSOperationQueue* opQueue = [[NSOperationQueue alloc] init];
[opQueue addOperation: op1];
[opQueue addOperation: op2];
[opQueue addOperation: op3];
Run Code Online (Sandbox Code Playgroud)

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

NSOperationQueue* opQueue = [[NSOperationQueue alloc] init];
[op3 addDependency: op1];
[op3 addDependency: op2];
[opQueue addOperation: op1];
[opQueue addOperation: op2];
[opQueue addOperation: op3];
Run Code Online (Sandbox Code Playgroud)

现在op3只会在op1和op2完成后运行.关于这一点的好处是你设置了依赖关系,然后只是将所有操作推到队列上而忘记它们(虽然向op3添加一个完成处理程序来告诉你它们什么时候完成它们可能是一个好主意).然后,操作系统负责平衡负载与并行化和您定义的排序.