Ios 找不到“此应用程序正在从后台线程修改自动布局引擎”的来源

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-

我的应用程序只有在我第一次登录时才会崩溃。它使用谷歌地图3.7.0 pod,我怀疑错误来自该库:

 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)
}