Closed crspybits closed 2 years ago
Hypothesis: It seems that the body of AnyIcon
is getting refreshed for each icon on the screen.
Observations:
1) The body of AnyIconMain
does get invoked.
HOWEVER: The body of AnyIcon
doesn't get invoked-- I'm getting no breakpoints there.
Conclusion: The body of AnyIconMain
is getting continuously re-invoked.
If I do this:
class AnyIconModel: ObservableObject, CommentCountsObserverDelegate, MediaItemBadgeObserverDelegate, NewItemBadgeObserverDelegate {
@Published var mediaItemBadge: MediaItemBadge?
@Published var unreadCountBadgeText: String?
@Published var newItem: Bool = false
var mediaItemCommentCount:CommentCountsObserver!
let object: ServerObjectModel
var mediaItemBadgeObserver: MediaItemBadgeObserver!
var newItemObserver: NewItemBadgeObserver!
init(object: ServerObjectModel) {
self.object = object
// mediaItemCommentCount = CommentCountsObserver(object: object, delegate: self)
// mediaItemBadgeObserver = MediaItemBadgeObserver(object: object, delegate: self)
// newItemObserver = NewItemBadgeObserver(object: object, delegate: self)
}
}
does it change matters?
Answer: No.
I just changed to:
struct AnyIconMain: View {
@ObservedObject var model:AnyIconModel
let config: IconConfig
var body: some View {
switch model.object.objectType {
case ImageObjectType.objectType:
ImageIcon(object: model.object, config: config)
case URLObjectType.objectType:
URLIcon(object: model.object, config: config)
// URLIcon(model: URLModel(urlObject: model.object), imageModel: GenericImageModel(objectType: model.object.objectType, fileLabel: URLObjectType.previewImageDeclaration.fileLabel, fileGroupUUID: model.object.fileGroupUUID, imageScale: config.iconSize), config: config)
case LiveImageObjectType.objectType:
LiveImageIcon(modelSetup: .object(fileLabel: LiveImageObjectType.imageDeclaration.fileLabel, object: model.object), config: config)
case GIFObjectType.objectType:
GIFIcon(object: model.object, config: config)
default:
EmptyView()
}
}
}
And, now, the issue is only occurring for object
types! (Not for URL types).
I then changed to using an @ObservedObject in GenericImageIcon
and ImageIcon
and the problem goes away. I'm back to 0% CPU when in the album items screen.
I think it's important to re-iterate that this was not a SQLite issue. This was a SwiftUI issue. I mention SQLite because the proximal issue fingered in the Xcode crash logs was SQLite.
I recently put in various performance improvements in the form of using @StateObject. I now have consistent crash from various screens when the app goes into the background. Digging into it, I find that
GenericImageModel
's keep getting re-instantiated.