From 4061a9fd7e77fdbd815f96d49f18b7ca9e9b5785 Mon Sep 17 00:00:00 2001 From: Matthew Lorentz Date: Thu, 4 Apr 2024 09:00:17 -0400 Subject: [PATCH 1/3] Account for queued insertions and deletions in PagedNoteDataSource.numberOfItemsInSection(:) --- .gitignore | 1 + Nos.xcodeproj/project.pbxproj | 100 ++++++++++++----------- Nos/Controller/PagedNoteDataSource.swift | 19 +++-- 3 files changed, 66 insertions(+), 54 deletions(-) diff --git a/.gitignore b/.gitignore index c051e80c6..d55e2db3b 100644 --- a/.gitignore +++ b/.gitignore @@ -82,3 +82,4 @@ fastlane/screenshots/**/*.png fastlane/test_output .idea +.vscode diff --git a/Nos.xcodeproj/project.pbxproj b/Nos.xcodeproj/project.pbxproj index 8a49951bf..50af06304 100644 --- a/Nos.xcodeproj/project.pbxproj +++ b/Nos.xcodeproj/project.pbxproj @@ -150,6 +150,7 @@ C94D855C2991479900749478 /* NewNoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94D855B2991479900749478 /* NewNoteView.swift */; }; C94D855F29914D2300749478 /* SwiftUINavigation in Frameworks */ = {isa = PBXBuildFile; productRef = C94D855E29914D2300749478 /* SwiftUINavigation */; }; C94FE9F729DB259300019CD3 /* Text+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A0DAE629C69FA000466635 /* Text+Gradient.swift */; }; + C951F2822BBED251008D8FE6 /* PagedNoteDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C98CA9062B14FBBF00929141 /* PagedNoteDataSource.swift */; }; C95D68A1299E6D3E00429F86 /* BioView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C95D68A0299E6D3E00429F86 /* BioView.swift */; }; C95D68A3299E6D9000429F86 /* SelectableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = C95D68A2299E6D9000429F86 /* SelectableText.swift */; }; C95D68A5299E6E1E00429F86 /* PlaceholderModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = C95D68A4299E6E1E00429F86 /* PlaceholderModifier.swift */; }; @@ -1236,12 +1237,12 @@ C9DEC0042989477A0078B43A /* Fixtures */ = { isa = PBXGroup; children = ( - C94B2D172B17F5EC002104B6 /* sample_repost.json */, - CD27177529A7C8B200AE8888 /* sample_replies.json */, + C9BD91882B61BBEF00FDA083 /* bad_contact_list.json */, C9DEC005298947900078B43A /* sample_data.json */, + CD27177529A7C8B200AE8888 /* sample_replies.json */, + C94B2D172B17F5EC002104B6 /* sample_repost.json */, C9ADB134299288230075E7F8 /* KeyFixture.swift */, C90B16B72AFED96300CB4B85 /* URLExtensionTests.swift */, - C9BD91882B61BBEF00FDA083 /* bad_contact_list.json */, ); path = Fixtures; sourceTree = ""; @@ -1610,22 +1611,22 @@ ); mainGroup = C9DEBFC5298941000078B43A; packageReferences = ( - C9DEC066298965270078B43A /* XCRemoteSwiftPackageReference "Starscream.git" */, - C97797BA298AB1890046BD25 /* XCRemoteSwiftPackageReference "secp256k1.swift" */, + C9DEC066298965270078B43A /* XCRemoteSwiftPackageReference "Starscream" */, + C97797BA298AB1890046BD25 /* XCRemoteSwiftPackageReference "secp256k1" */, C94D855D29914D2300749478 /* XCRemoteSwiftPackageReference "swiftui-navigation" */, - C9ADB139299299570075E7F8 /* XCRemoteSwiftPackageReference "bech32.git" */, + C9ADB139299299570075E7F8 /* XCRemoteSwiftPackageReference "bech32" */, C9646E9829B79E04007239A4 /* XCRemoteSwiftPackageReference "logger-ios" */, - C9646EA229B7A24A007239A4 /* XCRemoteSwiftPackageReference "posthog-ios.git" */, + C9646EA229B7A24A007239A4 /* XCRemoteSwiftPackageReference "posthog-ios" */, C9646EA529B7A3DD007239A4 /* XCRemoteSwiftPackageReference "swift-dependencies" */, - C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections.git" */, - C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa.git" */, + C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections" */, + C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa" */, C99DBF7C2A9E81CF00F7068F /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */, C9B737702AB24D5F00398BE7 /* XCRemoteSwiftPackageReference "SwiftGenPlugin" */, C95F0AC82ABA379700A0D9CE /* XCRemoteSwiftPackageReference "WalletConnectSwiftV2" */, - C9AA1BB82ABB62EB00E8BD6D /* XCRemoteSwiftPackageReference "Web3.swift" */, + C9AA1BB82ABB62EB00E8BD6D /* XCRemoteSwiftPackageReference "Web3" */, C9332C642ADED0D700AD7B0E /* XCLocalSwiftPackageReference "StarscreamOld" */, C91565BF2B2368FA0068EECA /* XCRemoteSwiftPackageReference "ViewInspector" */, - 3AD3185B2B294E6200026B07 /* XCRemoteSwiftPackageReference "xcstrings-tool-plugin.git" */, + 3AD3185B2B294E6200026B07 /* XCRemoteSwiftPackageReference "xcstrings-tool-plugin" */, ); productRefGroup = C9DEBFCF298941000078B43A /* Products */; projectDirPath = ""; @@ -2040,6 +2041,7 @@ C987F86229BABAF800B44E7A /* String+Markdown.swift in Sources */, C94A5E192A72C84200B6EC5D /* ReportCategory.swift in Sources */, C936B4632A4CB01C00DF1EB9 /* PushNotificationService.swift in Sources */, + C951F2822BBED251008D8FE6 /* PagedNoteDataSource.swift in Sources */, C9C5475A2A4F1D8C006B0741 /* NosNotification+CoreDataClass.swift in Sources */, CD09A74929A521210063464F /* Router.swift in Sources */, C90B16B82AFED96300CB4B85 /* URLExtensionTests.swift in Sources */, @@ -2122,11 +2124,11 @@ /* Begin PBXTargetDependency section */ 3AD3185D2B294E9000026B07 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - productRef = 3AD3185C2B294E9000026B07 /* plugin:XCStringsToolPlugin */; + productRef = 3AD3185C2B294E9000026B07 /* XCStringsToolPlugin */; }; 3AEABEF32B2BF806001BC933 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - productRef = 3AEABEF22B2BF806001BC933 /* plugin:XCStringsToolPlugin */; + productRef = 3AEABEF22B2BF806001BC933 /* XCStringsToolPlugin */; }; C90862C229E9804B00C35A71 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -2135,11 +2137,11 @@ }; C9A6C7442AD83F7A001F9500 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - productRef = C9A6C7432AD83F7A001F9500 /* plugin:SwiftGenPlugin */; + productRef = C9A6C7432AD83F7A001F9500 /* SwiftGenPlugin */; }; C9D573402AB24A3700E06BB4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - productRef = C9D5733F2AB24A3700E06BB4 /* plugin:SwiftGenPlugin */; + productRef = C9D5733F2AB24A3700E06BB4 /* SwiftGenPlugin */; }; C9DEBFE6298941020078B43A /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -2582,7 +2584,7 @@ /* End XCLocalSwiftPackageReference section */ /* Begin XCRemoteSwiftPackageReference section */ - 3AD3185B2B294E6200026B07 /* XCRemoteSwiftPackageReference "xcstrings-tool-plugin.git" */ = { + 3AD3185B2B294E6200026B07 /* XCRemoteSwiftPackageReference "xcstrings-tool-plugin" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/liamnichols/xcstrings-tool-plugin.git"; requirement = { @@ -2622,7 +2624,7 @@ minimumVersion = 1.1.0; }; }; - C9646EA229B7A24A007239A4 /* XCRemoteSwiftPackageReference "posthog-ios.git" */ = { + C9646EA229B7A24A007239A4 /* XCRemoteSwiftPackageReference "posthog-ios" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/PostHog/posthog-ios.git"; requirement = { @@ -2638,7 +2640,7 @@ minimumVersion = 0.1.4; }; }; - C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections.git" */ = { + C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/apple/swift-collections.git"; requirement = { @@ -2646,7 +2648,7 @@ minimumVersion = 1.0.0; }; }; - C97797BA298AB1890046BD25 /* XCRemoteSwiftPackageReference "secp256k1.swift" */ = { + C97797BA298AB1890046BD25 /* XCRemoteSwiftPackageReference "secp256k1" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/GigaBitcoin/secp256k1.swift"; requirement = { @@ -2662,7 +2664,7 @@ minimumVersion = 2.0.0; }; }; - C9AA1BB82ABB62EB00E8BD6D /* XCRemoteSwiftPackageReference "Web3.swift" */ = { + C9AA1BB82ABB62EB00E8BD6D /* XCRemoteSwiftPackageReference "Web3" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/Boilertalk/Web3.swift"; requirement = { @@ -2670,7 +2672,7 @@ minimumVersion = 0.8.4; }; }; - C9ADB139299299570075E7F8 /* XCRemoteSwiftPackageReference "bech32.git" */ = { + C9ADB139299299570075E7F8 /* XCRemoteSwiftPackageReference "bech32" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/0xdeadp00l/bech32.git"; requirement = { @@ -2678,7 +2680,7 @@ kind = branch; }; }; - C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa.git" */ = { + C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/getsentry/sentry-cocoa.git"; requirement = { @@ -2702,7 +2704,7 @@ minimumVersion = 6.6.2; }; }; - C9DEC066298965270078B43A /* XCRemoteSwiftPackageReference "Starscream.git" */ = { + C9DEC066298965270078B43A /* XCRemoteSwiftPackageReference "Starscream" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/daltoniam/Starscream.git"; requirement = { @@ -2713,19 +2715,19 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 3AD3185C2B294E9000026B07 /* plugin:XCStringsToolPlugin */ = { + 3AD3185C2B294E9000026B07 /* XCStringsToolPlugin */ = { isa = XCSwiftPackageProductDependency; - package = 3AD3185B2B294E6200026B07 /* XCRemoteSwiftPackageReference "xcstrings-tool-plugin.git" */; + package = 3AD3185B2B294E6200026B07 /* XCRemoteSwiftPackageReference "xcstrings-tool-plugin" */; productName = "plugin:XCStringsToolPlugin"; }; - 3AEABEF22B2BF806001BC933 /* plugin:XCStringsToolPlugin */ = { + 3AEABEF22B2BF806001BC933 /* XCStringsToolPlugin */ = { isa = XCSwiftPackageProductDependency; - package = 3AD3185B2B294E6200026B07 /* XCRemoteSwiftPackageReference "xcstrings-tool-plugin.git" */; + package = 3AD3185B2B294E6200026B07 /* XCRemoteSwiftPackageReference "xcstrings-tool-plugin" */; productName = "plugin:XCStringsToolPlugin"; }; C905B0742A619367009B8A78 /* DequeModule */ = { isa = XCSwiftPackageProductDependency; - package = C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections.git" */; + package = C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections" */; productName = DequeModule; }; C91565C02B2368FA0068EECA /* ViewInspector */ = { @@ -2748,7 +2750,7 @@ }; C94824492B32364900005B36 /* Web3 */ = { isa = XCSwiftPackageProductDependency; - package = C9AA1BB82ABB62EB00E8BD6D /* XCRemoteSwiftPackageReference "Web3.swift" */; + package = C9AA1BB82ABB62EB00E8BD6D /* XCRemoteSwiftPackageReference "Web3" */; productName = Web3; }; C94D855E29914D2300749478 /* SwiftUINavigation */ = { @@ -2773,7 +2775,7 @@ }; C9646EA329B7A24A007239A4 /* PostHog */ = { isa = XCSwiftPackageProductDependency; - package = C9646EA229B7A24A007239A4 /* XCRemoteSwiftPackageReference "posthog-ios.git" */; + package = C9646EA229B7A24A007239A4 /* XCRemoteSwiftPackageReference "posthog-ios" */; productName = PostHog; }; C9646EA629B7A3DD007239A4 /* Dependencies */ = { @@ -2783,7 +2785,7 @@ }; C9646EA829B7A4F2007239A4 /* PostHog */ = { isa = XCSwiftPackageProductDependency; - package = C9646EA229B7A24A007239A4 /* XCRemoteSwiftPackageReference "posthog-ios.git" */; + package = C9646EA229B7A24A007239A4 /* XCRemoteSwiftPackageReference "posthog-ios" */; productName = PostHog; }; C9646EAB29B7A520007239A4 /* Dependencies */ = { @@ -2793,17 +2795,17 @@ }; C96CB98B2A6040C500498C4E /* DequeModule */ = { isa = XCSwiftPackageProductDependency; - package = C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections.git" */; + package = C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections" */; productName = DequeModule; }; C97797BB298AB1890046BD25 /* secp256k1 */ = { isa = XCSwiftPackageProductDependency; - package = C97797BA298AB1890046BD25 /* XCRemoteSwiftPackageReference "secp256k1.swift" */; + package = C97797BA298AB1890046BD25 /* XCRemoteSwiftPackageReference "secp256k1" */; productName = secp256k1; }; C97797BE298ABE060046BD25 /* secp256k1 */ = { isa = XCSwiftPackageProductDependency; - package = C97797BA298AB1890046BD25 /* XCRemoteSwiftPackageReference "secp256k1.swift" */; + package = C97797BA298AB1890046BD25 /* XCRemoteSwiftPackageReference "secp256k1" */; productName = secp256k1; }; C99DBF7D2A9E81CF00F7068F /* SDWebImageSwiftUI */ = { @@ -2821,7 +2823,7 @@ package = C99DBF7C2A9E81CF00F7068F /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */; productName = SDWebImageSwiftUI; }; - C9A6C7432AD83F7A001F9500 /* plugin:SwiftGenPlugin */ = { + C9A6C7432AD83F7A001F9500 /* SwiftGenPlugin */ = { isa = XCSwiftPackageProductDependency; package = C9B737702AB24D5F00398BE7 /* XCRemoteSwiftPackageReference "SwiftGenPlugin" */; productName = "plugin:SwiftGenPlugin"; @@ -2833,7 +2835,7 @@ }; C9AA1BB92ABB62EB00E8BD6D /* Web3 */ = { isa = XCSwiftPackageProductDependency; - package = C9AA1BB82ABB62EB00E8BD6D /* XCRemoteSwiftPackageReference "Web3.swift" */; + package = C9AA1BB82ABB62EB00E8BD6D /* XCRemoteSwiftPackageReference "Web3" */; productName = Web3; }; C9AA1BBB2ABB6E8900E8BD6D /* WalletConnectModal */ = { @@ -2843,17 +2845,17 @@ }; C9B71DBD2A8E9BAD0031ED9F /* Sentry */ = { isa = XCSwiftPackageProductDependency; - package = C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa.git" */; + package = C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa" */; productName = Sentry; }; C9B71DBF2A8E9BAD0031ED9F /* SentrySwiftUI */ = { isa = XCSwiftPackageProductDependency; - package = C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa.git" */; + package = C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa" */; productName = SentrySwiftUI; }; C9B71DC42A9008300031ED9F /* Sentry */ = { isa = XCSwiftPackageProductDependency; - package = C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa.git" */; + package = C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa" */; productName = Sentry; }; C9BA85902B23628300AFC2C3 /* Logger */ = { @@ -2873,12 +2875,12 @@ }; C9BA85962B23638700AFC2C3 /* Starscream */ = { isa = XCSwiftPackageProductDependency; - package = C9DEC066298965270078B43A /* XCRemoteSwiftPackageReference "Starscream.git" */; + package = C9DEC066298965270078B43A /* XCRemoteSwiftPackageReference "Starscream" */; productName = Starscream; }; C9BA85982B23638700AFC2C3 /* secp256k1 */ = { isa = XCSwiftPackageProductDependency; - package = C97797BA298AB1890046BD25 /* XCRemoteSwiftPackageReference "secp256k1.swift" */; + package = C97797BA298AB1890046BD25 /* XCRemoteSwiftPackageReference "secp256k1" */; productName = secp256k1; }; C9BA859A2B23638700AFC2C3 /* SwiftUINavigation */ = { @@ -2888,17 +2890,17 @@ }; C9BA859C2B23638700AFC2C3 /* PostHog */ = { isa = XCSwiftPackageProductDependency; - package = C9646EA229B7A24A007239A4 /* XCRemoteSwiftPackageReference "posthog-ios.git" */; + package = C9646EA229B7A24A007239A4 /* XCRemoteSwiftPackageReference "posthog-ios" */; productName = PostHog; }; C9BA859E2B23638700AFC2C3 /* DequeModule */ = { isa = XCSwiftPackageProductDependency; - package = C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections.git" */; + package = C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections" */; productName = DequeModule; }; C9BA85A02B23638700AFC2C3 /* SentrySwiftUI */ = { isa = XCSwiftPackageProductDependency; - package = C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa.git" */; + package = C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa" */; productName = SentrySwiftUI; }; C9BA85A22B23638700AFC2C3 /* WalletConnect */ = { @@ -2908,7 +2910,7 @@ }; C9BA85A42B23638700AFC2C3 /* Web3 */ = { isa = XCSwiftPackageProductDependency; - package = C9AA1BB82ABB62EB00E8BD6D /* XCRemoteSwiftPackageReference "Web3.swift" */; + package = C9AA1BB82ABB62EB00E8BD6D /* XCRemoteSwiftPackageReference "Web3" */; productName = Web3; }; C9BA85A62B23638700AFC2C3 /* StarscreamOld */ = { @@ -2923,22 +2925,22 @@ }; C9BA85AA2B2363CA00AFC2C3 /* Sentry */ = { isa = XCSwiftPackageProductDependency; - package = C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa.git" */; + package = C9B71DBC2A8E9BAD0031ED9F /* XCRemoteSwiftPackageReference "sentry-cocoa" */; productName = Sentry; }; - C9D5733F2AB24A3700E06BB4 /* plugin:SwiftGenPlugin */ = { + C9D5733F2AB24A3700E06BB4 /* SwiftGenPlugin */ = { isa = XCSwiftPackageProductDependency; package = C9C8450C2AB249DB00654BC1 /* XCRemoteSwiftPackageReference "SwiftGenPlugin" */; productName = "plugin:SwiftGenPlugin"; }; C9DEC067298965270078B43A /* Starscream */ = { isa = XCSwiftPackageProductDependency; - package = C9DEC066298965270078B43A /* XCRemoteSwiftPackageReference "Starscream.git" */; + package = C9DEC066298965270078B43A /* XCRemoteSwiftPackageReference "Starscream" */; productName = Starscream; }; CDDA1F7A29A527650047ACD8 /* Starscream */ = { isa = XCSwiftPackageProductDependency; - package = C9DEC066298965270078B43A /* XCRemoteSwiftPackageReference "Starscream.git" */; + package = C9DEC066298965270078B43A /* XCRemoteSwiftPackageReference "Starscream" */; productName = Starscream; }; CDDA1F7C29A527650047ACD8 /* SwiftUINavigation */ = { diff --git a/Nos/Controller/PagedNoteDataSource.swift b/Nos/Controller/PagedNoteDataSource.swift index 902bcd23d..3f8877341 100644 --- a/Nos/Controller/PagedNoteDataSource.swift +++ b/Nos/Controller/PagedNoteDataSource.swift @@ -87,9 +87,14 @@ class PagedNoteDataSource: NSObject, UICol // MARK: - UICollectionViewDataSource func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - let numberOfItems = fetchedResultsController.fetchedObjects?.count ?? 0 - Log.debug("Number of items: \(numberOfItems) in section: \(section)") - return numberOfItems + let numberOfFetchedObjects = fetchedResultsController.fetchedObjects?.count ?? 0 + // because we batch updates together to reduce animations but this function is called in between batches we + // need to account for the number of items queued for insertion or deletion. FetchedResultsController sees them + // but the collectionView doesn't yet. + let numberOfItemsInView = numberOfFetchedObjects - insertedIndexes.count + deletedIndexes.count + Log.debug("Number of items: \(numberOfFetchedObjects) in fetchedResultsController") + Log.debug("Number of items: \(numberOfItemsInView) in section: \(section)") + return numberOfItemsInView } func collectionView( @@ -238,11 +243,15 @@ class PagedNoteDataSource: NSObject, UICol Log.debug("controllerDidChangeContent started.") if !deletedIndexes.isEmpty { // it doesn't seem like this check should be necessary but it crashes otherwise Log.debug("deleting indexPaths: \(deletedIndexes)") - collectionView.deleteItems(at: deletedIndexes) + let deletedIndexesCopy = deletedIndexes + deletedIndexes = [] // clear indexes so numberOfItemsInSection can calculate the correct number + collectionView.deleteItems(at: deletedIndexesCopy) } if !insertedIndexes.isEmpty { Log.debug("inserting indexPaths: \(insertedIndexes)") - collectionView.insertItems(at: insertedIndexes) + let insertedIndexesCopy = insertedIndexes + insertedIndexes = [] // clear indexes so numberOfItemsInSection can calculate the correct number + collectionView.insertItems(at: insertedIndexesCopy) } Log.debug("moving indexes: \(movedIndexes)") From 3702f910fff41d624fd940db2c66af066f2d8946 Mon Sep 17 00:00:00 2001 From: Matthew Lorentz Date: Thu, 4 Apr 2024 09:28:58 -0400 Subject: [PATCH 2/3] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b37a5584..c74b6299f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Updated dark theme colors for card backgrounds, primary text, and secondary text. - Added a new UI for replying to messages that allows attaching images and setting an expiration date. - Fixed an issue where Profile pages could display little or no content. +- Fixed a crash that often occurred after opening the app. ## [0.1.7] - 2024-03-21Z From a5e83ae19dbfa30886960d13103dcca48646168f Mon Sep 17 00:00:00 2001 From: Matthew Lorentz Date: Thu, 4 Apr 2024 10:08:46 -0400 Subject: [PATCH 3/3] Remove PagedNoteDataSource from NosTests --- Nos.xcodeproj/project.pbxproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/Nos.xcodeproj/project.pbxproj b/Nos.xcodeproj/project.pbxproj index 50af06304..160d0f2d1 100644 --- a/Nos.xcodeproj/project.pbxproj +++ b/Nos.xcodeproj/project.pbxproj @@ -150,7 +150,6 @@ C94D855C2991479900749478 /* NewNoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94D855B2991479900749478 /* NewNoteView.swift */; }; C94D855F29914D2300749478 /* SwiftUINavigation in Frameworks */ = {isa = PBXBuildFile; productRef = C94D855E29914D2300749478 /* SwiftUINavigation */; }; C94FE9F729DB259300019CD3 /* Text+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A0DAE629C69FA000466635 /* Text+Gradient.swift */; }; - C951F2822BBED251008D8FE6 /* PagedNoteDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C98CA9062B14FBBF00929141 /* PagedNoteDataSource.swift */; }; C95D68A1299E6D3E00429F86 /* BioView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C95D68A0299E6D3E00429F86 /* BioView.swift */; }; C95D68A3299E6D9000429F86 /* SelectableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = C95D68A2299E6D9000429F86 /* SelectableText.swift */; }; C95D68A5299E6E1E00429F86 /* PlaceholderModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = C95D68A4299E6E1E00429F86 /* PlaceholderModifier.swift */; }; @@ -2041,7 +2040,6 @@ C987F86229BABAF800B44E7A /* String+Markdown.swift in Sources */, C94A5E192A72C84200B6EC5D /* ReportCategory.swift in Sources */, C936B4632A4CB01C00DF1EB9 /* PushNotificationService.swift in Sources */, - C951F2822BBED251008D8FE6 /* PagedNoteDataSource.swift in Sources */, C9C5475A2A4F1D8C006B0741 /* NosNotification+CoreDataClass.swift in Sources */, CD09A74929A521210063464F /* Router.swift in Sources */, C90B16B82AFED96300CB4B85 /* URLExtensionTests.swift in Sources */,