我想在 dispatch_async 任务后移动到另一个视图控制器
I want to move to another view controller after a dispatch_async task
我试图通过在当前视图控制器中创建对象来调用另一个视图控制器的方法。我正在使用 dispatch_async 块通过串行 queue.The 串行队列的下一个任务必须是导航到另一个控制器(顺便说一句,它是我使用第一个任务方法的同一个控制器) .但是串行队列甚至在从第一个任务获取数据之前就在执行第二个任务。所以第二个任务中的条件失败并且导航不会发生。请帮助我。
我看到很多关于使用串行队列完成工作的答案,但我知道要更改用户界面,我们必须在主线程上。那么,这就是控制器不变的原因吗?有没有办法在主线程上创建一个串行队列?或者它总是在不同的线程上?感谢任何其他解决我问题的方法。
这是我的代码:
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");
});
你需要等待两个块完成之后你想执行 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];
需要一些时间 return
您为 callDisCoveryNewRequest
编辑的方法是
- (void) callDisCoveryNewRequestWithCompletionBlock:(void (^)())block;
并且在您完成提取后 return block()
并在 callDisCoveryNewRequestWithCompletionBlock
的完成块上执行 dispatch_group_leave(group);
希望对您有所帮助
我试图通过在当前视图控制器中创建对象来调用另一个视图控制器的方法。我正在使用 dispatch_async 块通过串行 queue.The 串行队列的下一个任务必须是导航到另一个控制器(顺便说一句,它是我使用第一个任务方法的同一个控制器) .但是串行队列甚至在从第一个任务获取数据之前就在执行第二个任务。所以第二个任务中的条件失败并且导航不会发生。请帮助我。
我看到很多关于使用串行队列完成工作的答案,但我知道要更改用户界面,我们必须在主线程上。那么,这就是控制器不变的原因吗?有没有办法在主线程上创建一个串行队列?或者它总是在不同的线程上?感谢任何其他解决我问题的方法。
这是我的代码:
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");
});
你需要等待两个块完成之后你想执行 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];
需要一些时间 return
您为 callDisCoveryNewRequest
编辑的方法是
- (void) callDisCoveryNewRequestWithCompletionBlock:(void (^)())block;
并且在您完成提取后 return block()
并在 callDisCoveryNewRequestWithCompletionBlock
dispatch_group_leave(group);
希望对您有所帮助