SyncServerII / Neebla

Private and Self-Owned Social Media
MIT License
1 stars 2 forks source link

App crashing when it goes into the background #27

Closed crspybits closed 2 years ago

crspybits commented 2 years ago

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.

crspybits commented 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.

crspybits commented 2 years ago

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.

crspybits commented 2 years ago

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

crspybits commented 2 years ago

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.

crspybits commented 2 years ago

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.