Tuesday, August 29, 2017

App Crash, “Lost Connection”

Leave a Comment

Similar to this this question,

I am having issues and my app is crashing in the same way. I would assume the same answer as on the other question: memory issue; except I am getting the crash during an AVAssetExportSession call.

guard let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality) else { return }         exporter.outputFileType = AVFileTypeMPEG4         exporter.outputURL = url         exporter.videoComposition = mainComposition         print("done")          exporter.exportAsynchronously(completionHandler: {             DispatchQueue.main.async(execute: {                 self.exportDidFinish(exporter)                 print("removing AI")                 self.removeAI()                 print("removed AI")                 completion()             })         })  func exportDidFinish(_ exporter:AVAssetExportSession) {     if(exporter.status == AVAssetExportSessionStatus.completed) {         print("cool")     }     else if(exporter.status == AVAssetExportSessionStatus.failed) {         print(exporter.error as Any)     } } 

It prints "done" but it never prints "removing AI". It also doesn't print "cool" or "(error)"; it crashes and says at the top of XCode "Lost connection to iPhone..." just as the other question states.

I would assume it is a memory issue, but there is nothing happening in between (to my knowledge of how this works) during the asynchronous exporting as I am just waiting for the completion handler to be called. But nothing gets called in between and I am unsure how to handle this. Any thoughts?

2 Answers

Answers 1

I think that AVAssetExportSession object may be deallocated while running async task. Consider put it as a class variable to make sure that async block can finish it's task. It will be something like:

class myClass {     var exporter: AVAssetExportSession?      func export() {         exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)         guard exporter != nil else { return }         exporter.outputFileType = AVFileTypeMPEG4         exporter.outputURL = url         exporter.videoComposition = mainComposition         print("done")          exporter?.exportAsynchronously(completionHandler: {              DispatchQueue.main.async {                self.exportDidFinish(exporter)                print("removing AI")                self.removeAI()                print("removed AI")                completion()            }         }     } } 

I'm really not sure why you also put everything on a main thread in completion block, but maybe you want to do something with UI later, so I leave it there.

But most import is - make your AVAssetExportSession not stored on method that may dealloc it. It's a memory issue that could cause this.

Answers 2

I had this issue before, it wasn't a memory issue for me. I don't know how exactly I got resolved, but I these are the things I did:

I deleted the app, hard reset the phone, cleaned build on Xcode, restarted Xcode, deleted derived data, and if I remember correctly changed the USB port until it got fixed.

I also had console and a VM open, I closed them as well.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment