Skip to content

Commit c4a8356

Browse files
authored
Merge pull request #19539 from wordpress-mobile/tonyli-remove-context-object-reader
Remove the stored context object in `ReaderStreamViewController`
2 parents 9c45156 + 274e871 commit c4a8356

File tree

2 files changed

+72
-73
lines changed

2 files changed

+72
-73
lines changed

RELEASE-NOTES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
21.2
22
-----
3+
* [*] [internal] Refactored fetching posts in the Reader tab. [#19539]
34

45

56
21.1

WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift

Lines changed: 71 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)