运行 3个方法一个接一个
Run 3 methods one after each other
我需要在一个调用 api(NSURLSessionDataTask 异步)的单独线程中一个接一个地 运行 3 个方法。我查看了调度组,但这似乎同时 运行 方法 1 和 2,然后 运行s 方法 3 当它们完成时:
dispatch_group_t group = dispatch_group_create();
//METHOD 1
dispatch_group_enter(group);
[self method1WithCompletion:^(BOOL success){
dispatch_group_leave(group);
}];
//METHOD 2
dispatch_group_enter(group);
[self method2WithCompletion:^(BOOL success){
dispatch_group_leave(group);
}];
dispatch_group_notify(group,dispatch_get_main_queue(),^{
//METHOD 3
});
我需要它到 运行 方法 1,当它完成时 运行 方法 2,当它最终完成时 运行 方法 3(将方法排队)。
我知道我可以将每次完成的方法链接到 运行 下一个,但我认为会有更好的方法...有什么想法吗?
你很接近。
dispatch_group_enter
和公司只处理使它成为 dispatch_group_enter
的所有内容 dispatch_group_t
将在调用传递给 dispatch_group_notify
的块之前完成。 =17=]
所以我们可以在等待任务的时候好好利用它们。我们可以为每个需要完成的异步任务使用一个组,而不是只有一个组等待每个任务完成:
// You can get a global queue or create your own, it doesn't really matter
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// Create a group for each task you want to wait for
dispatch_group_t group1 = dispatch_group_create();
dispatch_group_t group2 = dispatch_group_create();
// Call your first task on the first group
dispatch_group_enter(group1);
[self method1WithCompletion:^(BOOL success){
// Task is completed, so signal that it has finished
dispatch_group_leave(group1);
}];
// Call your 2nd task on the 2nd group
dispatch_group_enter(group2);
// Make the second task wait until group1 has completed before running
dispatch_group_notify(group1, queue, ^{
// METHOD 2
[self method2WithCompletion:^(BOOL success){
// Signal to the group that the task has completed
dispatch_group_leave(group2);
}];
});
// Nothing is waiting on the 3rd task, so no need to create a group for it
dispatch_group_notify(group2,dispatch_get_main_queue(),^{
//METHOD 3
// Do whatever you need to do in here
});
这里有一些关于 Dispatch Queues 以及如何使用它们的更多信息。
编辑:抱歉,我完全改变了我的答案。在您发表评论后,我突然意识到您调用的任务是异步的,使用串行 dispatch_queue_t
不会有什么不同! (块是连续的运行,但是方法2会在方法1之后立即运行,而不是等待完成)
已编辑: 我不这么认为了,cjwirth在下面的评论中驳斥了我的假设
我觉得还是可以用serial queue的方法(不过只是推测,我没去验证)。主要思想是将组的任务分派到串行队列中,在分派之前使用 dispatch_group_enter(group)
并在 method1..2 完成时使用 dispatch_group_leave(group)
。让我展示它应该是什么:
dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_group_t group = dispatch_group_create();
//METHOD 1
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
[self method1WithCompletion:^(BOOL success){
dispatch_async(queue, ^{
dispatch_group_leave(group);
});
}];
});
//METHOD 2
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
[self method2WithCompletion:^(BOOL success){
dispatch_async(queue, ^{
dispatch_group_leave(group);
});
}];
});
dispatch_group_notify(group,dispatch_get_main_queue(),^{
//METHOD 3
});
注意: 这种实现看起来有些不对劲。由于我们已经有了 NSOperationQueue,所以我建议您将 NSURLSessionDataTask
的东西包装到 NSOperation 中并按顺序执行它们
我需要在一个调用 api(NSURLSessionDataTask 异步)的单独线程中一个接一个地 运行 3 个方法。我查看了调度组,但这似乎同时 运行 方法 1 和 2,然后 运行s 方法 3 当它们完成时:
dispatch_group_t group = dispatch_group_create();
//METHOD 1
dispatch_group_enter(group);
[self method1WithCompletion:^(BOOL success){
dispatch_group_leave(group);
}];
//METHOD 2
dispatch_group_enter(group);
[self method2WithCompletion:^(BOOL success){
dispatch_group_leave(group);
}];
dispatch_group_notify(group,dispatch_get_main_queue(),^{
//METHOD 3
});
我需要它到 运行 方法 1,当它完成时 运行 方法 2,当它最终完成时 运行 方法 3(将方法排队)。
我知道我可以将每次完成的方法链接到 运行 下一个,但我认为会有更好的方法...有什么想法吗?
你很接近。
dispatch_group_enter
和公司只处理使它成为 dispatch_group_enter
的所有内容 dispatch_group_t
将在调用传递给 dispatch_group_notify
的块之前完成。 =17=]
所以我们可以在等待任务的时候好好利用它们。我们可以为每个需要完成的异步任务使用一个组,而不是只有一个组等待每个任务完成:
// You can get a global queue or create your own, it doesn't really matter
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// Create a group for each task you want to wait for
dispatch_group_t group1 = dispatch_group_create();
dispatch_group_t group2 = dispatch_group_create();
// Call your first task on the first group
dispatch_group_enter(group1);
[self method1WithCompletion:^(BOOL success){
// Task is completed, so signal that it has finished
dispatch_group_leave(group1);
}];
// Call your 2nd task on the 2nd group
dispatch_group_enter(group2);
// Make the second task wait until group1 has completed before running
dispatch_group_notify(group1, queue, ^{
// METHOD 2
[self method2WithCompletion:^(BOOL success){
// Signal to the group that the task has completed
dispatch_group_leave(group2);
}];
});
// Nothing is waiting on the 3rd task, so no need to create a group for it
dispatch_group_notify(group2,dispatch_get_main_queue(),^{
//METHOD 3
// Do whatever you need to do in here
});
这里有一些关于 Dispatch Queues 以及如何使用它们的更多信息。
编辑:抱歉,我完全改变了我的答案。在您发表评论后,我突然意识到您调用的任务是异步的,使用串行 dispatch_queue_t
不会有什么不同! (块是连续的运行,但是方法2会在方法1之后立即运行,而不是等待完成)
已编辑: 我不这么认为了,cjwirth在下面的评论中驳斥了我的假设
我觉得还是可以用serial queue的方法(不过只是推测,我没去验证)。主要思想是将组的任务分派到串行队列中,在分派之前使用 dispatch_group_enter(group)
并在 method1..2 完成时使用 dispatch_group_leave(group)
。让我展示它应该是什么:
dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_group_t group = dispatch_group_create();
//METHOD 1
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
[self method1WithCompletion:^(BOOL success){
dispatch_async(queue, ^{
dispatch_group_leave(group);
});
}];
});
//METHOD 2
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
[self method2WithCompletion:^(BOOL success){
dispatch_async(queue, ^{
dispatch_group_leave(group);
});
}];
});
dispatch_group_notify(group,dispatch_get_main_queue(),^{
//METHOD 3
});
注意: 这种实现看起来有些不对劲。由于我们已经有了 NSOperationQueue,所以我建议您将 NSURLSessionDataTask
的东西包装到 NSOperation 中并按顺序执行它们