Ios 找不到“此应用程序正在从后台线程修改自动布局引擎”的来源
我的应用程序只有在我第一次登录时才会崩溃。它使用谷歌地图3.7.0 pod,我怀疑错误来自该库:Ios 找不到“此应用程序正在从后台线程修改自动布局引擎”的来源,ios,swift,xcode,google-maps,ios13,Ios,Swift,Xcode,Google Maps,Ios13,我的应用程序只有在我第一次登录时才会崩溃。它使用谷歌地图3.7.0 pod,我怀疑错误来自该库: Stack:( 0 Foundation 0x000000018c1b8550 80C31587-F538-3437-966F-300F6632EB95 + 2331984 1 Foundation 0x000000018bfb18c4 80C31587-F538-3437-
Stack:(
0 Foundation 0x000000018c1b8550 80C31587-F538-3437-966F-300F6632EB95 + 2331984
1 Foundation 0x000000018bfb18c4 80C31587-F538-3437-966F-300F6632EB95 + 207044
2 Foundation 0x000000018bfb17d8 80C31587-F538-3437-966F-300F6632EB95 + 206808
3 Foundation 0x000000018bfb1448 80C31587-F538-3437-966F-300F6632EB95 + 205896
4 UIKitCore 0x000000019025a824 AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 15611940
5 UIKitCore 0x000000019026db1c AA897CA9-8D15-3DD7-BB4F-8D90F9A28571 + 15690524
6 libobjc.A.dylib 0x000000018b9e0a4c A486C2B3-41B0-3F23-AF40-C5579F5BE97E + 6732
7 QuartzCore 0x0000000192883a9c A3363F67-6783-3979-8FA9-5563ABD4737D + 1403548
8 QuartzCore 0x0000000192883eec A3363F67-6783-3979-8FA9-5563ABD4737D + 1404652
9 QuartzCore 0x0000000192896614 A3363F67-6783-3979-8FA9-5563ABD4737D + 1480212
10 QuartzCore 0x00000001927db1c4 A3363F67-6783-3979-8FA9-5563ABD4737D + 713156
11 QuartzCore 0x0000000192805fd0 A3363F67-6783-3979-8FA9-5563ABD4737D + 888784
12 QuartzCore 0x0000000192806fb8 A3363F67-6783-3979-8FA9-5563ABD4737D + 892856
13 libsystem_pthread.dylib 0x000000018b9dd104 5F848A4C-4907-3FC9-A76D-378FE8F2E4FC + 37124
14 libsystem_pthread.dylib 0x000000018b9d58a0 5F848A4C-4907-3FC9-A76D-378FE8F2E4FC + 6304
15 libsystem_pthread.dylib 0x000000018b9d7a20 5F848A4C-4907-3FC9-A76D-378FE8F2E4FC + 14880
16 libsystem_pthread.dylib 0x000000018b9d7760 _pthread_wqthread + 424
17 libsystem_pthread.dylib 0x000000018b9dd9e8 start_wqthread + 8
)
这是XCode中显示的跟踪日志
编辑器屏幕截图:
这就是我从ViewModel接收回调的方式。我在所有输出中添加了DispatchQueue.main以避免此异常,但仍然会弹出
处置包插入
viewModel.outputs.OnShowling加载
.bind{show in
DispatchQueue.main.async{
self.showLoadingshow:show
}
},
viewModel.outputs.onLoadDone
.bind{mapInfo in
DispatchQueue.main.async{
self.loadMapInfo:mapInfo
}
},
viewModel.outputs.onLoadError
.bind{中的错误
DispatchQueue.main.async{
加载资源时打印错误:\ERROR.localizedDescription
}
},
viewModel.outputs.onMultiClusterTap
.bind中的{路径
DispatchQueue.main.async{
self.centerMappaths:路径
}
},
viewModel.outputs.OnLoadAssessInFodone
.bind{资产在
DispatchQueue.main.async{
self.showBottomSheetassets:资产
}
},
viewModel.outputs.onDeviceChanged
.绑定{
DispatchQueue.main.async{
self!.showDeviceChangedError
}
}
2020年5月2日编辑:
我尝试使用
但我仍然找不到这个错误的根源。
此外,我发现在注销-登录之后也会发生错误。所以这不是我第一次安装这个应用程序
2020年5月7日编辑:
也许正如沃纳·阿尔特维舍尔所指出的那样,有一个图形库正在搞乱这一点。这是我的播客文件,可能有助于解决这个问题:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '11.0'
use_frameworks!
target 'WatchmanDoor' do
pod 'DropDown', '2.3.13'
pod 'GoogleMaps', '3.7.0'
pod 'GooglePlaces'
pod 'DKImagePickerController', '4.2.1'
pod 'Alamofire', '4.9.1'
pod 'iOSDFULibrary', '4.6.1'
pod 'RxSwift', '~> 5.0.1'
pod 'RxCocoa', '~> 5.0.1'
pod 'Swinject', '~> 2.7.1'
pod 'SwinjectAutoregistration', '~> 2.7.0'
pod 'SwinjectStoryboard', '~> 2.2.0'
pod 'FittedSheets', :git => 'https://github.com/WatchmanDoor/FittedSheets.git', :commit => '9824dd171499967226a4dd160aedc7d4d9db3a11'
pod 'SDWebImage', '~> 5.5.0'
pod 'NavigationDrawer', '1.0.2'
end
可能是FittedSheets吊舱引发了错误吗?我使用存储库更新它以支持Swift 5,但可能是导致异常的那个
更新:
仍然面临着同样的错误。。。找不到其他东西-_-
知道从哪里开始吗
完整事故报告:
重要更新:
我发现,当应用程序崩溃时,我的堆栈视图中充满了UITRANSITIONVIEW。不知道这是否有关系
解决方案[13/05/2020]
所以我想我找到了错误的来源。请参阅下面的答案。显然,有问题的后台线程线程线程17正在直接访问某些UIKit方法,这通常是不允许的,只能从主线程执行
您是否使用GCD的dispatch async在后台线程上调度了一些方法?因此我想我找到了错误的来源。 当我收到来自API和资产列表的响应时,我创建了一个MapInfo模型,如下所示:
private func generateMapInfo(assets: [APIAssetModel]) -> MapInfoModel {
var markers = [ClusterMarkerItem]()
var locations = [CLLocationCoordinate2D]()
assets.forEach({ asset in
if nil != asset.lat && nil != asset.lng {
if asset.lat! > -85 && asset.lat! < 85 {
let latlng = CLLocationCoordinate2D(latitude: asset.lat!, longitude: asset.lng!)
for index in 0..<(asset.productsCount ?? 0) {
let marker = GMSMarker(position: latlng)
marker.title = "\(asset.id)_\(index)"
markers.append(ClusterMarkerItem(position: latlng,
marker: marker,
asset: asset,
prod_position: index))
}
locations.append(latlng)
}
}
})
return MapInfoModel(assetList: assets, clusterList: markers, locationList: locations)
}
这个方法是从后台线程调用的,如您所见,我正在实例化一个GMSMarker。这不会引起任何错误/警告,地图已加载并很好地显示集群。但是,问题是,我怀疑在加载集群后,Google Maps SDK会对其中加载的GMSMarker执行某些操作,我怀疑,该操作是从创建GMSMarker的线程调用的,因此,如果它是从后台线程创建的,XCode将显示错误:
此应用程序正在从后台线程修改autolayout引擎
我只是猜测,但我正在等待谷歌确认这一点。因此,解决方案是从主线程实例化GMSMarker,在本例中,我使用DispatchQueue.Main.async{}
更新
谷歌只是给我发电子邮件确认一下。他们是这样说的:
我们的专家已确认所有标记的创建和更新
应该发生在主线程上
这是因为iOS中的所有绘图和渲染都必须在
主线程,并将对标记所做的更新转换为
直接的
我们将努力将这些信息纳入我们的官方文件中
供将来参考的文件
请显示编辑器屏幕截图。请确保在您发出api请求并将完成的内容返回给dispatch to main Thread后,我添加了另一个屏幕截图。我不知道这是否是你的意思。当你的数据成功接收时,你必须在DispatchQueue.main.async{//update ui}@KishanBhatiya上更新ui。我知道,问题是我找不到从后台线程调用ui的位置,我从XCode控制台调用日志一点帮助都没有。是的,我从,背景线。正如我所说,我使用Rx,所以
从视图模型发出的调用的数量来自后台线程。从stacktrace判断,有一些调用直接从后台线程进入QuartzCore。看起来您在代码的任何地方都不会这样做。您正在使用一些图形库,例如QR扫描仪。通过谷歌搜索你的错误,我在这里发现了一个类似的问题:谢谢@werneraltwischer,我已经添加了我的pod文件,以防万一。我还将检查我分叉并迁移到Swift 5的FittedSheets吊舱,以防万一。我在原始帖子中添加了更多信息,请看我是否有用。谢谢
private func generateMapInfo(assets: [APIAssetModel]) -> MapInfoModel {
var markers = [ClusterMarkerItem]()
var locations = [CLLocationCoordinate2D]()
assets.forEach({ asset in
if nil != asset.lat && nil != asset.lng {
if asset.lat! > -85 && asset.lat! < 85 {
let latlng = CLLocationCoordinate2D(latitude: asset.lat!, longitude: asset.lng!)
for index in 0..<(asset.productsCount ?? 0) {
let marker = GMSMarker(position: latlng)
marker.title = "\(asset.id)_\(index)"
markers.append(ClusterMarkerItem(position: latlng,
marker: marker,
asset: asset,
prod_position: index))
}
locations.append(latlng)
}
}
})
return MapInfoModel(assetList: assets, clusterList: markers, locationList: locations)
}