iOS 12 specific problem: Core Data External Storage Binary Data corruption
Update: The underlying Core Data issue appears to be resolved in iOS 12.1 (verified in beta 4). We will keep the workaround described below in our app, and won't be recommending using the External Storage option any time soon.
After talking to Apple engineers and filing the Radar mentioned above, we couldn’t wait around for a fix, so we took the hit and switched to storing files on the filesystem and managing it directly ourselves.
Another alternative that we considered was migrating our model not to allow External Storage for BLOBs, but I don't know what impact that would have had on performance and I was also worried about a model migration at a time when this part of iOS seems to be unstable, especially after reading stories like this in the past: Core Data: don’t store large files as binary data – Alexander Edge – Medium
It wasn't too much of a pain to implement local storage ourselves. You just need to have a unique identifier for each record that you can use to create a filename so you can map files to records. We added an extension to our Managed Object subclass with methods for reading, writing and deleting the files. Now, instead of calling e.g. article.photo = image.pngData()
, we now need to call something like article.savePhoto(image.pngData())
and then we do similar when we want to retrieve the image. You can also add some code to these methods to support backwards compatibility with any images that are currently stored in Core Data.
Deletion was a little more tricky because our objects are deleted from multiple places in the code, including cascading deletes. In the end I opted to do it in the managed object's prepareForDeletion
method but it is not ideal. There is plenty of discussion of how best to implement this here: cocoa - How to handle cleanup of external data when deleting unsaved Core Data objects? - Stack Overflow
Finally, to prevent our app crashing when a non-Optional binary attribute has disappeared because of this bug, I override awakeFromFetch
in my Managed Object subclass to ensure that any required attributes are not nil, and if they are, I set them to a placeholder image so that they can be saved without the validation failing.
PDF.js is randomly crashing the Google Chrome tab
Yes, I got it now.
From https://github.com/mozilla/pdf.js/issues/4104, I found the answer (thanks Rob and PDF.js dev team!). Take a look yourself!
I'm only posting this here so that anyone who stumbles upon this post with a similar problem can be helped (as this error took me quite a while to figure out).
Related Topics
Search Multiple Words in One String in Swift
Swift Memory Management: Storing Func in Var
How to Use a Value Type Object as a Reference Type
Problems Accessing Calendar Using Ekeventstore on Osx Sierra with Swift 3
Can You Evaluate a String in Swift
Nswindow with Round Corners in Swift
Unknown Error When Adding an CSSearchableitem to Core Spotlight (Macos)
Select All Text in a Nstextfield Using Swift
Create Generic Delegate for Class
Swift and Objectmapper: Nsdate with Min Value
Alamofire 3 Custom Encoding to Alamofire 4 Custom Encoding
How to Make Player Move to Opposite Side While Is in a Path
How to Check If Airpods Are Connected to Iphone
In What Situation Would One Use Expectationfornotification in Swift Testing
Cannot Subscript a Value of Type '[String:String]' with an Index of Type 'String'
How to Retrieve All Contacts Using Cncontact.Predicateforcontacts