Firebase crashlytics报告了我的应用程序中有很多见解的可用崩溃

问题描述 投票:0回答:1

下面是我的代码

    func getImageFrom(_ asset: PHAsset, completion: @escaping (UIImage) -> Void) {
        var thumbnail = UIImage()
        let imageManager = PHCachingImageManager()
        let options = PHImageRequestOptions()
        options.version = .current
        let size = CGSize(width: 150.0, height: 150.0)

        imageManager.requestImage(for: asset, targetSize: size, contentMode: .aspectFill, 
        options: nil) { (image, info) in
            guard let img = image else { return }
            thumbnail = img
        }
        completion(thumbnail)
    }

我正在使用此功能从PHAsset获取图像。

据报道有一些时间崩溃thumbnail = imgcompletion(thumbnail)

在下面的代码块中使用此功能

func getImageDataAndFindDupImages() {
   var i = 0
   var similarImages = [OSTuple<NSString, NSString>]()
   similarImages = OSImageHashing.sharedInstance().similarImages(with: .high) { () -> OSTuple<NSString, NSData>? in
       #if DEBUG
       print(i)
       #endif
       var tuple = OSTuple<NSString, NSData>()
       if self.tempArrAssets.count > 0 {
           DispatchQueue.main.async {
               self.lblNumberOfPhoto.text = R.string.localizable.scanning_photos_number("\(i+1)", "\(self.arrPhotoAssets.count)")
           }
           if !self.tempArrAssets.isEmpty {
               let tempArrAsset = self.tempArrAssets.removeFirst()
               self.getImageFrom(tempArrAsset) { (imageAsset) in
                   self.arrImageFromAsset.append(imageAsset)
                   if let imgData = imageAsset.pngData() {
                       tuple = (OSTuple<NSString, NSData>(first: NSString(string: "\(i)"), andSecond: imgData as NSData))
                   }
               }
               i += 1
               return tuple
           } else {
               return nil
           }
       } else {
           return nil
       }
   }
   print("To make dup tuples:", Date().timeIntervalSince(self.date))
}

我正在使用getImageFrom中的getImageDataAndFindDupImages

这是崩溃的日志

Crashed: com.apple.mobileslideshow.accessCallbacks
0  libobjc.A.dylib                0x18a874020 objc_retain + 16
1  Duplicate Cleaner              0x1001f0e80 closure #1 in DuplicatePhotoFinderVC.getImageDataAndFindDupImages() + 519 (DuplicatePhotoFinderVC.swift:519)
2  Duplicate Cleaner              0x1001f16a4 thunk for @escaping @callee_guaranteed () -> (@owned OSTuple<NSString, NSData>?) + 4338357924 (<compiler-generated>:4338357924)
3  CocoaImageHashing              0x1004f3514 -[OSSimilaritySearch similarImagesWithProvider:withHashDistanceThreshold:forImageStreamHandler:forResultHandler:] + 46 (OSSimilaritySearch.m:46)
4  CocoaImageHashing              0x1004f3924 -[OSSimilaritySearch similarImagesWithProvider:withHashDistanceThreshold:forImageStreamHandler:] + 95 (OSSimilaritySearch.m:95)
5  CocoaImageHashing              0x1004f28d0 -[OSImageHashing similarImagesWithProvider:withHashDistanceThreshold:forImageStreamHandler:] + 222 (OSImageHashing.m:222)
6  CocoaImageHashing              0x1004f27b0 -[OSImageHashing similarImagesWithHashingQuality:withHashDistanceThreshold:forImageStreamHandler:] + 201 (OSImageHashing.m:201)
7  CocoaImageHashing              0x1004f2734 -[OSImageHashing similarImagesWithHashingQuality:forImageStreamHandler:] + 190 (OSImageHashing.m:190)
8  Duplicate Cleaner              0x1001ee63c DuplicatePhotoFinderVC.getImageDataAndFindDupImages() + 316 (DuplicatePhotoFinderVC.swift:316)
9  Duplicate Cleaner              0x1001ee434 DuplicatePhotoFinderVC.fetchPhotosandCheckforDuplicate() + 146 (DuplicatePhotoFinderVC.swift:146)
10 Duplicate Cleaner              0x1001eea1c closure #1 in DuplicatePhotoFinderVC.checkForPermissionAndScanPhotos() + 162 (DuplicatePhotoFinderVC.swift:162)
11 Duplicate Cleaner              0x10021bdec thunk for @escaping @callee_guaranteed (@unowned PHAuthorizationStatus) -> () + 4338531820 (<compiler-generated>:4338531820)
12 Photos                         0x195ff9098 __39+[PHPhotoLibrary requestAuthorization:]_block_invoke + 64
13 AssetsLibraryServices          0x19f048edc __79-[PLPrivacy _isPhotosAccessAllowedWithScope:forceHandler:accessAllowedHandler:]_block_invoke.14 + 520
14 AssetsLibraryServices          0x19f01486c __pl_dispatch_async_block_invoke + 36
15 libdispatch.dylib              0x18a7fe610 _dispatch_call_block_and_release + 24
16 libdispatch.dylib              0x18a7ff184 _dispatch_client_callout + 16
17 libdispatch.dylib              0x18a7ab404 _dispatch_lane_serial_drain$VARIANT$mp + 608
18 libdispatch.dylib              0x18a7abdf8 _dispatch_lane_invoke$VARIANT$mp + 420
19 libdispatch.dylib              0x18a7b5314 _dispatch_workloop_worker_thread + 588
20 libsystem_pthread.dylib        0x18a84eb88 _pthread_wqthread + 276
21 libsystem_pthread.dylib        0x18a851760 start_wqthread + 8

我不明白为什么会出现这些崩溃。如果您有任何知识,请指导我。

ios swift crashlytics phasset firebase-crash-reporting
1个回答
0
投票
您正在将nil传递给imageManager.requestImage(for:targetSize: contentMode:options:)中的

选项参数。如果将nil作为选项传递,则该方法异步调用完成块。因此,有可能在您的完成块被调用时,方法getImageFrom(: completion:)已退出并且局部变量thumbnail已被破坏(我不是在谈论UIImage对象被破坏,而是保存UIImage地址的变量本身)。然后尝试设置不再在堆栈上的缩略图变量,这可能是块内崩溃的原因。

解决您的问题,创建PHImageRequestOptions的实例,将其isSynchronous属性设置为

true

,就像这样。let options = PHImageRequestOptions() options.isSynchronous = true
现在将此options作为参数传递给imageManager.requestImage(for:targetSize: contentMode:options:)

因此,您的imageManager.requestImage(for:targetSize: contentMode:options:)将在getImageFrom(: completion:)方法退出之前同步调用该块,因此变量thumbnail在要使用的堆栈上仍然有效。

希望这可以解决您的问题。

PS:请注意您在后台线程中调用方法getImageFrom(: completion:),否则主线程将被冻结

© www.soinside.com 2019 - 2024. All rights reserved.