【问题标题】:How can I speed up my request to enabled a Bar Button Item in Navigation Item?如何加快在导航项中启用条形按钮项的请求?
【发布时间】:2018-01-20 18:11:05
【问题描述】:

在 ViewDidLoad() 中的第一个 ViewController 中,有 2 个操作:

  1. 将 buttonGo.isEnabled = false(buttonGo 是条形按钮项)
  2. 发出请求,通过 Web 服务检查设备是否已获得授权。

检查设备是否被授权是在单例类委托中完成的。它调用:DownloadAuthorize,它有一个委托方法:updateView()。

如果设备是授权的,我会回调ViewController中的委托方法updateView(),这个方法使得buttonGo.isEnabled = true

一切正常,但 buttonGo 在几秒钟后启用。我以这种方式进行调查,在我看来,buttonGo 是由后台线程启用的。我尝试在委托方法中使用 view.setNeedsLayout()、view.setNeedsDisplay(),因为我希望加快重绘组件,但我得到了类似这样的错误: “在从主线程访问引擎后,此应用程序正在从后台线程修改自动布局引擎。这可能导致引擎损坏和奇怪的崩溃”

是否可以做一些事情来加快控件的刷新速度?

谢谢

【问题讨论】:

  • 请参考this链接,检查约束何时更新。

标签: ios swift uiviewcontroller uibutton autolayout


【解决方案1】:

显然已经完成了,因为它是从在后台线程或完成处理程序中运行的代码修改 AutoLayout UI 元素/约束的代码。默认情况下,所有完成处理程序都在后台线程中运行。您需要使用 GCD 从完成处理程序块中更新 UI 元素。

DispatchQueue.main.async { // UI update/changes task here }

【讨论】:

  • 感谢您的回答,但也许我错过了一些东西,或者我解释得不好。 buttonGo 必须保持禁用状态,直到它收到授权。当授权良好时,buttonGo 启用。我知道只有正确调用方法委托 updateView() 时授权才可以。
  • 谢谢你,Jaydeep 和 Bhadresh。现在看来我解决了。在方法 updateView() 中,我提出了您的建议,现在它似乎运行良好。还要感谢@Nilay,他向我展示了如何应用更改的正确方法
【解决方案2】:

在主线程上调用你的方法。

DispatchQueue.main.async { 
       updateView()
}

【讨论】:

  • 感谢您的回答,但也许我错过了一些东西,或者我解释得不好。 buttonGo 必须保持禁用状态,直到它收到授权。当授权良好时,buttonGo 启用。我知道当方法委托 updateView() 被正确调用时授权是好的。
猜你喜欢
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
相关资源
最近更新 更多