当前位置: 首页 > 知识库问答 >
问题:

如何在IOS中处理此类异步任务?

赖星驰
2023-03-14

我有三项任务。任务1、任务2和任务3。task1和task2是异步任务,即它们同时执行任务,返回完成结果的时间不可预测。最初,我希望task1和task2同时执行,并在得到结果后执行task3。

dispatch_group_t dispatchGroup = dispatch_group_create();    

dispatch_group_async(dispatchGroup,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   //do task1 async
});
dispatch_group_async(dispatchGroup,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   //do task2 async
});
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    while (true) {
         sleep(0.2); //avoid cpu timeslice fully used
         //after get task1 and task2 result
         // do task3 
}});

我设计的结构如上所述,但我总是得到不好的结果,比如如果task2是一个url发布请求,使用afnet,我不能得到成功块参与。

任何帮助我的人我都会感激的。

共有2个答案

平元明
2023-03-14

好的,还有一个解决方案:

            dispatch_group_t group = dispatch_group_create();
            dispatch_queue_t queue1 = ...;
            dispatch_queue_t queue2 = ...;
            //add task to queue
            dispatch_group_async(group, queue1, ^{NSLog(@"Hello, World! TASK 1"); });
            dispatch_group_async(group, queue2, ^{NSLog(@"Hello, World! TASK 2"); });
//    wait forever
            dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
//    or wait with timeout
            dispatch_group_wait(group, DISPATCH_TIME_NOW);

            //Add notify for end of all tasks
            dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"Tasks 1 and 2 are done!");});

检查时间是否已过

dispatch_time_t waitTime = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
long waitResult = dispatch_group_wait(group, waitTime);

if (waitResult == 0)
{
    // all done!
} else
{
    // time out
}

不要忘记释放

dispatch_release(group);
谯英彦
2023-03-14

我认为有这样的解决办法:

__weak CLASS * weakSelf = self;
bool task1Done;
bool task2Done;

FIRST ONE TASK
task1Done = NO;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

       do something at background....

        dispatch_async(dispatch_get_main_queue(), ^{
            do some thing at main thread...
        [weakSelf task1Done];
        });
    });

SECOND TASK
task2Done = NO;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

       do something at background....

        dispatch_async(dispatch_get_main_queue(), ^{
            do some thing at main thread...
        [weakSelf task2Done];
        });
    });


============
-(void) task1Done
{   
    task1Done = YES;
    if (task1Done && task2Done) [self startTask3];
}

-(void) task2Done
{   
    task2Done = YES;
    if (task1Done && task2Done) [self startTask3];
}

-(void) startTask3
{
.....
}
 类似资料:
  • 编辑:Redis+Sidekiq完成该工作。在这里,Redis作为一个消息队列工作,Sidekiq在后台处理这些消息。我很想知道,选择一个显式代理(如RabbitMQ、SQS、Redis PubSub)而不是Redis+SideKiQ有什么用例和好处?

  • 如果这被认为是一个可接受的实践,我需要什么-如果有-错误处理?我的理解是,task.wait()将重新抛出异步操作抛出的任何异常,并且我没有提供任何取消异步操作的机制。仅仅调用task.wait()就足够了吗?

  • 当生成消息到Kafka时,您可以得到两种错误:可检索和不可检索。在处理它们时,你应该如何区分它们? 我希望异步生成记录,将接收到不可重试异常的记录保存在另一个主题(或HBase)中,并让生产者为我处理所有接收到可重试异常的记录(最多尝试次数,当它最终到达时,会成为第一批异常之一)。 我的问题是:尽管有,但生产者是否仍会自行处理可检索的异常?因为在接口回调中说: 可重试异常(暂时的,可通过增加#.重

  • 问题内容: 我有一个场景,我将必须对服务器进行六个http调用才能获取六个不同项目的数据。这些服务器调用不能合并,并且它们就是那样。例如:如果您需要GOOGLE的报价信息,则向服务器发送请求,以请求google的报价信息。接下来,如果您需要Yahoo,则可以发起另一个http调用,依此类推。 情况如下: 现在,我的最终用户想要比较6家不同的公司。 正如我提到的那样,我不可避免地要使用6个异步任务进

  • 我试图弄清楚如何处理从返回的数据。 我有一个活动,我正在调用异步Firebase get操作(存在于其他类中的操作),并且我想使用检索到的ArrayList的大小更新活动中存在的。以下是我在活动创建中获取的 Firebase 调用: 这是我的Firebase操作: 在Android中,最好的方法是什么?是否有可能实现各种适配器或完成处理程序?

  • 在Servlet 3.0中,引入了异步处理的概念。所以所有的书都说这消除了每个请求一个线程的要求。我已经测试过了,是的,它确实有效。现在,我有一个简单的servlet,用户在其中以同步模式启动HTTP请求。线程只需Hibernate1秒,然后回复客户端。当我对这种模式进行负载测试时,服务器每秒只能处理4个请求。现在,我将同步模式更改为异步模式,并根据请求创建一个新线程,将原始http线程释放回池。