【问题标题】:I want to move to another view controller after a dispatch_async task我想在 dispatch_async 任务之后移动到另一个视图控制器
【发布时间】:2017-01-08 19:14:07
【问题描述】:

我试图通过在当前视图控制器中创建一个对象来从另一个视图控制器调用一个方法。我正在使用 dispatch_async 块来处理串行队列。串行队列的下一个任务必须是导航到另一个控制器(顺便说一句,它与我使用第一个任务方法的控制器相同)。但是串行队列甚至在从第一个任务中获取数据之前就正在执行第二个任务。所以第二个任务中的条件失败并且导航不会发生。请帮帮我。

我看到了很多使用串行队列完成工作的答案,但我知道要更改用户界面,我们必须在主线程上。那么,这就是控制器不改变的原因吗?有没有办法在主线程上创建一个串行队列?还是总是在不同的线程上?感谢您对我的问题的任何其他解决方案。

这是我的代码:

    dispatch_queue_t serialQueue=dispatch_queue_create("***", DISPATCH_QUEUE_SERIAL);

    dispatch_async(serialQueue, ^
    {
        NSLog(@"first async");
        [discoveryNewsObject callDiscoveryNewsRequest];
        NSLog(@"first async complete");
    });

    dispatch_async(serialQueue(), ^
    {
       NSLog(@"second async");
       if ([NSArray arrayWithArray:appDelegate.getNewsArray[0]].count==[NSArray arrayWithArray:appDelegate.postImageDimensionsArray].count && [NSArray arrayWithArray:appDelegate.getNewsArray[0]].count!=0)
    {
        NSLog(@"counts are equal");

        [self performSegueWithIdentifier:@"DiscoverySegue" sender:self];
    }
    NSLog(@"second async complete");
});

【问题讨论】:

  • 你为什么要在队列中执行这种步骤?您可以通过简单的方法转到另一个视图控制器。
  • 所以你想等待两个异步关闭完成然后才移动到下一个视图控制器?
  • 你想让我把方法从另一个视图控制器复制到这里试试??索拉布
  • 是的。 Tj3n。我希望在移动到另一个控制器之前完成第一个任务。
  • 你应该发布callDiscoveryNewsRequest 函数,它可能需要一个完成块来完成请求后执行代码

标签: ios objective-c multithreading grand-central-dispatch dispatch-async


【解决方案1】:

你需要等待两个块都完成之后才能执行 segue

试试这个代码

  dispatch_group_t group = dispatch_group_create();

    dispatch_group_enter(group);
    dispatch_async(serialQueue, ^
                   {
                       NSLog(@"first async");
                       [discoveryNewsObject callDiscoveryNewsRequest];
                       NSLog(@"first async complete");
                       dispatch_group_leave(group);
                   });
    dispatch_group_enter(group);

    dispatch_async(serialQueue(), ^
                   {
                       NSLog(@"second async");
                       if ([NSArray arrayWithArray:appDelegate.getNewsArray[0]].count==[NSArray arrayWithArray:appDelegate.postImageDimensionsArray].count && [NSArray arrayWithArray:appDelegate.getNewsArray[0]].count!=0)
                       {
                           NSLog(@"counts are equal");

                       }
                       NSLog(@"second async complete");
                       dispatch_group_leave(group);

                   });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        [self performSegueWithIdentifier:@"DiscoverySegue" sender:self];

    })

编辑


当你观察到[discoveryNewsObject callDiscoveryNewsRequest]; 需要一段时间才能回来

callDisCoveryNewRequest 的方法编辑是

- (void) callDisCoveryNewRequestWithCompletionBlock:(void (^)())block;

在您的提取完成后返回block() 并在callDisCoveryNewRequestWithCompletionBlock的完成块上执行dispatch_group_leave(group);

希望对你有帮助

【讨论】:

  • callDiscoveryNewsRequest 之后调用dispatch_group_leave(group) 我认为没有完成处理程序不会有任何效果,因为callDiscoveryNewsRequest 是异步的(可能?)然后它会跳过该过程并立即离开该组
  • ya [discoveryNewsObject callDiscoveryNewsRequest]; 需要阻塞操作,他应该在那里执行阻塞并在该阻塞成功或失败时离开
  • mike alter- 一开始我没有注意到,因为获取的数据较少,但是当数据很高时,实际上需要几秒钟的时间来获取控制仍然会在获取发生之前移动到另一个控制器。 . 还有其他方法可以实现我想要的吗??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多