运行 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 中并按顺序执行它们