对于搜索,错误消息是:
此应用程序正在从后台线程修改autolayout引擎,这可能导致引擎损坏和奇怪的崩溃.这将在将来的版本中导致异常.
我知道这意味着从后台线程调用一些UIKit代码,我知道解决方案是将代码包装进去
dispatch_async(dispatch_get_main_queue(), ^(void){ <code> });
我的问题是找到这样做的地方,因为没有任何打印的堆栈跟踪引用我的应用程序代码.我证明这是否定的证据是在调试输出窗口中搜索(命令-f)我的应用程序的名称; 我有24个堆栈跟踪被丢弃,我的应用程序名称不在其中任何一个,除了顶部有错误消息.我可以发布其中一个,但这似乎没有用.
在我今天工作的情况下,在转换视图控制器viewWillDisappear()之前和之后都会发生这种情况viewWillAppear().我发现我的部分代码要包装dispatch_async(),但现在都处理完了.我有断点和调试消息,其中分配和取消分配与视图控制器相关的对象,并且它们都在异常消息出现后触发.在调试和发布模式下,模拟器和我的iOS9 iPhone都会发生这种情况.
如何识别显然修改UI的后台代码?
当我在模拟器中运行我的应用程序时,我在控制台中获取此日志.在iOS 8中没有看到这个.我不太清楚是什么导致了这一点.有没有其他人遇到同样的问题,如果是这样,它是如何解决的?或者是否有人可以提供任何帮助?
我收到此错误此应用程序正在从后台线程修改autolayout引擎,这可能导致引擎损坏和奇怪的崩溃.这将导致未来版本中的异常.我不知道是什么导致了这个错误.有谁能够帮我.
func getUserDataFromTwitterWithUser(user : PFUser)
{
//NRLoader.showLoader()
let strTwURL = "https://api.twitter.com/1.1/users/show.json? screen_name="+PFTwitterUtils.twitter()!.screenName! + "&access_token="+PFTwitterUtils.twitter()!.authToken!
let twURL = NSURL (string: strTwURL)
let request = NSMutableURLRequest(URL: twURL!, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 2.0) as NSMutableURLRequest
PFTwitterUtils.twitter()?.signRequest(request)
let session = NSURLSession.sharedSession()
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
if error == nil {
var jsonOptional = Dictionary<String, AnyObject>()
do {
jsonOptional = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers ) as! Dictionary<String, AnyObject>
// use jsonData
} catch {
// report error
}
var userName = ""
if …Run Code Online (Sandbox Code Playgroud) 我有一个问题使用UIWebView.
当UIWebView扩展到全屏模式时,我一直收到以下信息:
此应用程序正在从后台线程修改autolayout引擎,这可能导致引擎损坏和奇怪的崩溃.这将在将来的版本中导致异常.
这是我的简单代码,也是我唯一的代码:
@IBOutlet var player: UIWebView!
override func viewDidLoad()
{
super.viewDidLoad()
let url = "http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8"
let frame: Int = 10
let html = "<html><body><iframe src=\"\(url)\" width=395 height=290 frameborder=\(frame)></iframe></body></html>"
player.loadHTMLString(html as String, baseURL: nil)
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下问题的解决方案,它没有做任何事情:
dispatch_async(dispatch_get_main_queue(), {
let html = "<html><body><iframe src=\"\(url)\" width=395 height=290 frameborder=\(frame)></iframe></body></html>"
self.player.loadHTMLString(html as String, baseURL: nil)
})
Run Code Online (Sandbox Code Playgroud)我试过另一个解决方案
将PSPDFUIKitMainThreadGuard添加到项目中无法解决此问题.
正如您所看到的,我的代码非常简单,与我发现的其他问题不同,所有这些解决方案都指向在主线程中执行UI更改,我添加了代码以尝试执行,但我仍然收到警告.
还有很多我发现的与我相似的问题,但它们都指向同样的解决方案,这对我不起作用,所以我没有费心去列出它们.
有没有人对此有任何见解?你可以自己尝试这个简单的代码,你会看到同样的问题.
谢谢
当代码的某些部分正在从主线程以外的其他线程更改UI项时,会将此错误记录到控制台.但是我怎样才能找到它的位置呢?
我很难搞清楚如何修复"此应用程序正在从后台线程修改自动布局引擎"错误.任何帮助是极大的赞赏.
我尝试使用这个类似问题概述的方法来使用dispatch_async(dispatch_get_main_qeueu()),但它没有解决问题.我使用不正确吗?
从调试开始,我已经发现Firebase调用重置用户密码至少是问题的一部分.当我遗漏该代码时,没有错误.
相关代码和完整错误消息如下:
//MARK: - Forgot Password Button Tapped
@IBAction func forgotPasswordButtonTapped(sender: AnyObject) {
let userEnteredEmail = emailTextField.text
//Have Firebase send email to reset password
dispatch_async(dispatch_get_main_queue(), {
FIRAuth.auth()?.sendPasswordResetWithEmail(userEnteredEmail!, completion: { error in
if error != nil {
//Tell user that the user name or password is incorrect.
let errorCode = error!.code
switch (errorCode) {
// Error code handling alerting user to issue.
}
}
else {
//Send user to the forgot password screen.
self.performSegueWithIdentifier("toForgotPasswordViewController", sender: self)
} …Run Code Online (Sandbox Code Playgroud) 我知道所有 UI 更新都必须从主线程完成。
但纯粹是为了更深入地了解 GCD 和 dispatch main 是如何工作的:
我有一个运行网络调用的按钮,我最终在它的 completionHandler 中执行以下操作:
self.layer.borderColor = UIColor(red: 255/255.0, green: 59/255.0, blue: 48/255.0, alpha: 1.0).cgColor
self.layer.borderWidth = 3.0
Run Code Online (Sandbox Code Playgroud)
发生颜色变化需要 6-7 秒。显然,如果从主线程运行上面的代码,它会立即改变边框颜色。
问题 1即使我没有任何其他代码可以运行,为什么 UI 更改不会立即从后台线程发生?还在等什么?
有趣的是,如果我点击按钮进行网络调用,然后点击textField 本身(在 6-7 秒之前),边框颜色会立即改变。
发生这种情况是因为:
从后台线程我已经更新了模型,即更改将要更新的 UI/视图排队的 textField 颜色……但是由于我们在后台队列中,因此更新 UI 可能需要几秒钟的时间
但随后我立即点击了 textField 并强制超级快速读取 textField 及其所有属性,包括边框 - 从主线程(实际用户触摸始终通过主线程处理)......即使还没有屏幕上显示为红色,但由于模型上显示为红色,因此它将从中读取并立即将颜色更改为红色。
问题 2:这种观察是否正确?
如果我不点击并等待:
如果我点击:
我的完整代码如下:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBAction func isValid(_ sender: Any) {
let userEmail = textField.text …Run Code Online (Sandbox Code Playgroud) 我几乎完成了将我的iOS应用程序迁移到Swift 3.0.但我仍然有一些类似于下面的情况.其中大部分我都能通过将有问题的代码放在主线程上来解决.
在其他一些情况下,我无法弄清楚,我的代码的哪一部分正在错误的线程上执行.我收到这样的消息:
This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
Stack:(
0 CoreFoundation 0x000000018765a1d8 <redacted> + 148
1 libobjc.A.dylib 0x000000018609455c objc_exception_throw + 56
2 CoreFoundation 0x000000018765a108 <redacted> + 0
3 Foundation 0x0000000188241ea4 <redacted> + 192
....................
16 libsystem_pthread.dylib 0x00000001866eece4 <redacted> + 200
17 libsystem_pthread.dylib 0x00000001866ee378 pthread_mutex_lock + 0
18 libsystem_pthread.dylib 0x00000001866edda4 start_wqthread + 4
)
Run Code Online (Sandbox Code Playgroud)
是否有一些特殊的技术(使用调试器时的选项或??)我可以用来跟踪progran所遵循的路径,看看这发生了什么?
ios ×6
swift ×5
xcode ×2
autolayout ×1
background ×1
dispatch ×1
firebase ×1
ios9 ×1
iphone ×1
objective-c ×1
task-queue ×1
uiwebview ×1
xcode7 ×1
xcode7-beta4 ×1