我想保持活动主线程不冻结我的应用程序。但是我不知道如何在异步任务中做出非竞赛条件。所以我需要等待我的异步任务,但不要阻塞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/

10-09 16:19