@@ -58,18 +58,13 @@ import Combine
5858 }
5959 }
6060
61- lazy var syncContext : NSManagedObjectContext = {
62- return ContextManager . sharedInstance ( ) . newDerivedContext ( )
63- } ( )
64-
65- lazy var service : ReaderPostService = {
66- return ReaderPostService ( managedObjectContext: syncContext)
67- } ( )
61+ private var coreDataStack : CoreDataStack {
62+ ContextManager . shared
63+ }
6864
69- /// An alias for the apps's main context – temporarily replaces `newMainContextChildContext` until we have `NSPersistentContainer` support
70- ///
65+ /// An alias for the apps's main context
7166 private var viewContext : NSManagedObjectContext {
72- ContextManager . sharedInstance ( ) . mainContext
67+ coreDataStack . mainContext
7368 }
7469
7570 private( set) lazy var footerView : PostListFooterView = {
@@ -1016,46 +1011,47 @@ import Combine
10161011 return
10171012 }
10181013
1019- syncContext. perform { [ weak self] in
1020- guard let topicInContext = ( try ? self ? . syncContext. existingObject ( with: topic. objectID) ) as? ReaderAbstractTopic else {
1021- DDLogError ( " Error: Could not retrieve an existing topic via its objectID " )
1022- return
1023- }
1024-
1025- let objectID = topicInContext. objectID
1014+ let objectID = topic. objectID
10261015
1027- let successBlock = { [ weak self] ( count: Int , hasMore: Bool ) in
1028- DispatchQueue . main. async {
1029- if let strongSelf = self {
1030- if strongSelf. recentlyBlockedSitePostObjectIDs. count > 0 {
1031- strongSelf. recentlyBlockedSitePostObjectIDs. removeAllObjects ( )
1032- strongSelf. updateAndPerformFetchRequest ( )
1033- }
1034- strongSelf. updateLastSyncedForTopic ( objectID)
1016+ let successBlock = { [ weak self] ( count: Int , hasMore: Bool ) in
1017+ DispatchQueue . main. async {
1018+ if let strongSelf = self {
1019+ if strongSelf. recentlyBlockedSitePostObjectIDs. count > 0 {
1020+ strongSelf. recentlyBlockedSitePostObjectIDs. removeAllObjects ( )
1021+ strongSelf. updateAndPerformFetchRequest ( )
10351022 }
1036- success ? ( hasMore )
1023+ strongSelf . updateLastSyncedForTopic ( objectID )
10371024 }
1025+ success ? ( hasMore)
10381026 }
1027+ }
10391028
1040- let failureBlock = { ( error: Error ? ) in
1041- DispatchQueue . main. async {
1042- if let error = error {
1043- failure ? ( error as NSError )
1044- }
1029+ let failureBlock = { ( error: Error ? ) in
1030+ DispatchQueue . main. async {
1031+ if let error = error {
1032+ failure ? ( error as NSError )
10451033 }
10461034 }
1047-
1048- self ? . fetch ( for: topicInContext, success: successBlock, failure: failureBlock)
10491035 }
1036+
1037+ self . fetch ( for: topic, success: successBlock, failure: failureBlock)
10501038 }
10511039
1052- func fetch( for topic: ReaderAbstractTopic , success: @escaping ( ( _ count: Int , _ hasMore: Bool ) -> Void ) , failure: @escaping ( ( _ error: Error ? ) -> Void ) ) {
1053- if ReaderHelpers . isTopicSearchTopic ( topic) {
1054- service. fetchPosts ( for: topic, atOffset: 0 , deletingEarlier: false , success: success, failure: failure)
1055- } else if let topic = topic as? ReaderTagTopic {
1056- service. fetchPostsV2 ( for: topic, success: success, failure: failure)
1057- } else {
1058- service. fetchPosts ( for: topic, earlierThan: Date ( ) , success: success, failure: failure)
1040+ func fetch( for originalTopic: ReaderAbstractTopic , success: @escaping ( ( _ count: Int , _ hasMore: Bool ) -> Void ) , failure: @escaping ( ( _ error: Error ? ) -> Void ) ) {
1041+ coreDataStack. performAndSave { context in
1042+ guard let topic = ( try ? context. existingObject ( with: originalTopic. objectID) ) as? ReaderAbstractTopic else {
1043+ DDLogError ( " Error: Could not retrieve an existing topic via its objectID " )
1044+ return
1045+ }
1046+
1047+ let service = ReaderPostService ( managedObjectContext: context)
1048+ if ReaderHelpers . isTopicSearchTopic ( topic) {
1049+ service. fetchPosts ( for: topic, atOffset: 0 , deletingEarlier: false , success: success, failure: failure)
1050+ } else if let topic = topic as? ReaderTagTopic {
1051+ service. fetchPostsV2 ( for: topic, success: success, failure: failure)
1052+ } else {
1053+ service. fetchPosts ( for: topic, earlierThan: Date ( ) , success: success, failure: failure)
1054+ }
10591055 }
10601056 }
10611057
@@ -1081,8 +1077,8 @@ import Combine
10811077
10821078 let sortDate = post. sortDate
10831079
1084- syncContext . perform { [ weak self] in
1085- guard let topicInContext = ( try ? self ? . syncContext . existingObject ( with: topic. objectID) ) as? ReaderAbstractTopic else {
1080+ coreDataStack . performAndSave { [ weak self] context in
1081+ guard let topicInContext = ( try ? context . existingObject ( with: topic. objectID) ) as? ReaderAbstractTopic else {
10861082 DDLogError ( " Error: Could not retrieve an existing topic via its objectID " )
10871083 return
10881084 }
@@ -1110,11 +1106,12 @@ import Combine
11101106 }
11111107 }
11121108
1109+ let service = ReaderPostService ( managedObjectContext: context)
11131110 if ReaderHelpers . isTopicSearchTopic ( topicInContext) {
11141111 assertionFailure ( " Search topics should no have a gap to fill. " )
1115- self ? . service. fetchPosts ( for: topicInContext, atOffset: 0 , deletingEarlier: true , success: successBlock, failure: failureBlock)
1112+ service. fetchPosts ( for: topicInContext, atOffset: 0 , deletingEarlier: true , success: successBlock, failure: failureBlock)
11161113 } else {
1117- self ? . service. fetchPosts ( for: topicInContext, earlierThan: sortDate, deletingEarlier: true , success: successBlock, failure: failureBlock)
1114+ service. fetchPosts ( for: topicInContext, earlierThan: sortDate, deletingEarlier: true , success: successBlock, failure: failureBlock)
11181115 }
11191116 }
11201117 }
@@ -1128,37 +1125,30 @@ import Combine
11281125
11291126 footerView. showSpinner ( true )
11301127
1131- syncContext. perform { [ weak self] in
1132- guard let topicInContext = ( try ? self ? . syncContext. existingObject ( with: topic. objectID) ) as? ReaderAbstractTopic else {
1133- DDLogError ( " Error: Could not retrieve an existing topic via its objectID " )
1134- return
1135- }
1136-
1137- let successBlock = { ( count: Int , hasMore: Bool ) in
1138- DispatchQueue . main. async ( execute: {
1139- success ? ( hasMore)
1140- } )
1141- }
1142-
1143- let failureBlock = { ( error: Error ? ) in
1144- guard let error = error else {
1145- return
1146- }
1128+ let successBlock = { ( count: Int , hasMore: Bool ) in
1129+ DispatchQueue . main. async ( execute: {
1130+ success ? ( hasMore)
1131+ } )
1132+ }
11471133
1148- DispatchQueue . main . async ( execute : {
1149- failure ? ( error as NSError )
1150- } )
1134+ let failureBlock = { ( error : Error ? ) in
1135+ guard let error = error else {
1136+ return
11511137 }
11521138
1153- self ? . fetchMore ( for: topicInContext, success: successBlock, failure: failureBlock)
1139+ DispatchQueue . main. async ( execute: {
1140+ failure ? ( error as NSError )
1141+ } )
11541142 }
11551143
1144+ self . fetchMore ( for: topic, success: successBlock, failure: failureBlock)
1145+
11561146 if let properties = topicPropertyForStats ( ) {
11571147 WPAppAnalytics . track ( . readerInfiniteScroll, withProperties: properties)
11581148 }
11591149 }
11601150
1161- func fetchMore( for topic : ReaderAbstractTopic , success: @escaping ( ( Int , Bool ) -> Void ) , failure: @escaping ( ( Error ? ) -> Void ) ) {
1151+ private func fetchMore( for originalTopic : ReaderAbstractTopic , success: @escaping ( ( Int , Bool ) -> Void ) , failure: @escaping ( ( Error ? ) -> Void ) ) {
11621152 guard
11631153 let posts = content. content,
11641154 let post = posts. last as? ReaderPost ,
@@ -1168,14 +1158,22 @@ import Combine
11681158 return
11691159 }
11701160
1171- if ReaderHelpers . isTopicSearchTopic ( topic) {
1172- let offset = UInt ( content. contentCount)
1173- service. fetchPosts ( for: topic, atOffset: UInt ( offset) , deletingEarlier: false , success: success, failure: failure)
1174- } else if let topic = topic as? ReaderTagTopic {
1175- service. fetchPostsV2 ( for: topic, isFirstPage: false , success: success, failure: failure)
1176- } else {
1177- let earlierThan = sortDate
1178- service. fetchPosts ( for: topic, earlierThan: earlierThan, success: success, failure: failure)
1161+ coreDataStack. performAndSave { context in
1162+ guard let topic = ( try ? context. existingObject ( with: originalTopic. objectID) ) as? ReaderAbstractTopic else {
1163+ DDLogError ( " Error: Could not retrieve an existing topic via its objectID " )
1164+ return
1165+ }
1166+
1167+ let service = ReaderPostService ( managedObjectContext: context)
1168+ if ReaderHelpers . isTopicSearchTopic ( topic) {
1169+ let offset = UInt ( self . content. contentCount)
1170+ service. fetchPosts ( for: topic, atOffset: UInt ( offset) , deletingEarlier: false , success: success, failure: failure)
1171+ } else if let topic = topic as? ReaderTagTopic {
1172+ service. fetchPostsV2 ( for: topic, isFirstPage: false , success: success, failure: failure)
1173+ } else {
1174+ let earlierThan = sortDate
1175+ service. fetchPosts ( for: topic, earlierThan: earlierThan, success: success, failure: failure)
1176+ }
11791177 }
11801178 }
11811179
0 commit comments