我想保持活动主线程不冻结我的应用程序。但是我不知道如何在异步任务中做出非竞赛条件。所以我需要等待我的异步任务,但不要阻塞mainQueue。
public override bool ShouldPerformSegue(string segueIdentifier, NSObject sender)
{
bool isAlowed = false;
ActivityIndicator.StartAnimating();
DispatchQueue.GetGlobalQueue(DispatchQueuePriority.High).DispatchAsync(()=>
{
NSThread.SleepFor(2);
isAlowed = true;
});
return isAlowed;
}
最佳答案
与其启动同步,然后尝试确定是否应异步执行,不如不触发同步就简单地处理用户交互,而是确定是否应执行同步,然后启动同步。
由于我不太了解Xamarin,因此我无法提供确切的代码,但是伪代码类似于:
handleHandleButtonTap() {
initiateBackgroundCheckWithHandler( isAllowed(bool) {
if isAllowed {
performSegueWithIdentifer("SomeSegue") // You need to dispatch this on the main queue
}
})
}
Xamarin / C#示例:
void SomeButton_TouchUpInside(object sender, EventArgs e)
{
bool isAllowed = false;
InvokeInBackground(() =>
{
// Do some task... and optionally assign isAllowed to true...
if (isAllowed)
DispatchQueue.MainQueue.DispatchAsync(() => PerformSegue("SomeSegue", this));
});
}
关于ios - 比赛条件GCD,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49341862/