代码之家  ›  专栏  ›  技术社区  ›  Sam

比赛条件GCD

  •  0
  • Sam  · 技术社区  · 6 年前

    我想让主线程保持活动状态,以免冻结我的应用程序。但我不知道如何在异步任务中设置非竞争条件。所以我需要等待我的异步任务,但不阻塞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 回复  |  直到 6 年前
        1
  •  1
  •   SushiHangover    6 年前

    而不是启动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));
        });
    }