比赛条件GCD

时间:2018-03-17 20:59:00

标签: ios xamarin grand-central-dispatch

我想保持活动主线程不冻结我的应用程序。但我不知道如何通过我的异步任务来制造非竞赛条件。所以我需要等待我的异步任务,但不要阻止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;
}

1 个答案:

答案 0 :(得分:1)

不是启动segue然后尝试确定是否应该异步执行segue,而是简单地处理用户交互而不触发segue,确定是否应该执行segue并且然后启动SEGUE。

我不能给你准确的代码,因为我不太了解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));
    });
}