Skip to content

Commit fc64c0b

Browse files
authored
Merge pull request #19880 from wordpress-mobile/tonyli-fix-reader-topic-posts-loading-issue
Extract `ReaderPostService.fetchPostsV2` to a new service type
2 parents ab3a689 + ad9f779 commit fc64c0b

File tree

4 files changed

+39
-39
lines changed

4 files changed

+39
-39
lines changed

WordPress/Classes/Services/ReaderPostService.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@ extern NSString * const ReaderPostServiceToggleSiteFollowingState;
99

1010
@interface ReaderPostService : LocalCoreDataService
1111

12-
@property (copy, nonatomic) NSString *nextPageHandle;
13-
@property (nonatomic) NSInteger pageNumber;
14-
1512
/**
1613
Fetches the posts for the specified topic
1714

WordPress/Classes/Services/ReaderPostService+PostsV2.swift renamed to WordPress/Classes/Services/ReaderPostStreamService.swift

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
import Foundation
22

3-
extension ReaderPostService {
4-
func fetchPostsV2(for topic: ReaderTagTopic, isFirstPage: Bool = true, success: @escaping (Int, Bool) -> Void, failure: @escaping (Error?) -> Void) {
3+
class ReaderPostStreamService {
4+
5+
private let coreDataStack: CoreDataStack
6+
7+
private var nextPageHandle: String?
8+
private var pageNumber: Int = 0
9+
10+
init(coreDataStack: CoreDataStack) {
11+
self.coreDataStack = coreDataStack
12+
}
13+
14+
func fetchPosts(for topic: ReaderTagTopic, isFirstPage: Bool = true, success: @escaping (Int, Bool) -> Void, failure: @escaping (Error?) -> Void) {
515
if isFirstPage {
616
nextPageHandle = nil
717
}
818

919
let remoteService = ReaderPostServiceRemote.withDefaultApi()
1020
remoteService.fetchPosts(for: [topic.slug], page: nextPageHandle, success: { posts, pageHandle in
11-
self.managedObjectContext.perform {
12-
13-
if self.managedObjectContext.parent == ContextManager.shared.mainContext {
14-
// Its possible the ReaderAbstractTopic was deleted the parent main context.
15-
// If so, and we merge and save, it will cause a crash.
16-
// Reset the context so it will be current with its parent context.
17-
self.managedObjectContext.reset()
18-
}
19-
20-
guard let readerTopic = try? self.managedObjectContext.existingObject(with: topic.objectID) as? ReaderAbstractTopic else {
21+
self.coreDataStack.performAndSave { context in
22+
guard let readerTopic = try? context.existingObject(with: topic.objectID) as? ReaderAbstractTopic else {
2123
// if there was an error or the topic was deleted just bail.
2224
success(0, false)
2325
return
@@ -27,44 +29,41 @@ extension ReaderPostService {
2729

2830
if isFirstPage {
2931
self.pageNumber = 1
30-
self.removePosts(forTopic: readerTopic)
32+
self.removePosts(forTopic: readerTopic, in: context)
3133
} else {
3234
self.pageNumber += 1
3335
}
3436

3537
posts.enumerated().forEach { index, remotePost in
36-
let post = ReaderPost.createOrReplace(fromRemotePost: remotePost, for: readerTopic, context: self.managedObjectContext)
38+
let post = ReaderPost.createOrReplace(fromRemotePost: remotePost, for: readerTopic, context: context)
3739
// To keep the API order
3840
post?.sortRank = NSNumber(value: Date().timeIntervalSinceReferenceDate - Double(((self.pageNumber * Constants.paginationMultiplier) + index)))
3941
}
4042

4143
// Clean up
42-
self.deletePostsInExcessOfMaxAllowed(for: readerTopic)
43-
self.deletePostsFromBlockedSites()
44-
45-
ContextManager.shared.save(self.managedObjectContext) {
46-
let hasMore = pageHandle != nil
47-
success(posts.count, hasMore)
48-
}
49-
44+
let serivce = ReaderPostService(managedObjectContext: context)
45+
serivce.deletePostsInExcessOfMaxAllowed(for: readerTopic)
46+
serivce.deletePostsFromBlockedSites()
47+
} completion: {
48+
let hasMore = pageHandle != nil
49+
success(posts.count, hasMore)
5050
}
51-
5251
}, failure: { error in
5352
failure(error)
5453
})
5554
}
5655

57-
private func removePosts(forTopic topic: ReaderAbstractTopic) {
56+
private func removePosts(forTopic topic: ReaderAbstractTopic, in context: NSManagedObjectContext) {
5857
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: ReaderPost.classNameWithoutNamespaces())
5958
fetchRequest.predicate = NSPredicate(format: "topic == %@", argumentArray: [topic])
6059
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "sortRank", ascending: false)]
6160
fetchRequest.returnsObjectsAsFaults = false
6261

6362
do {
64-
let results = try managedObjectContext.fetch(fetchRequest)
63+
let results = try context.fetch(fetchRequest)
6564
for object in results {
6665
guard let objectData = object as? NSManagedObject else { continue }
67-
managedObjectContext.delete(objectData)
66+
context.delete(objectData)
6867

6968
// Checar se ta em uso ou foi salvo
7069
}

WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ import Combine
4848
private var noResultsStatusViewController = NoResultsViewController.controller()
4949
private var noFollowedSitesViewController: NoResultsViewController?
5050

51+
private lazy var readerPostStreamService = ReaderPostStreamService(coreDataStack: coreDataStack)
52+
5153
var resultsStatusView: NoResultsViewController {
5254
get {
5355
guard let noFollowedSitesVC = noFollowedSitesViewController else {
@@ -1048,12 +1050,13 @@ import Combine
10481050
return
10491051
}
10501052

1051-
let service = ReaderPostService(managedObjectContext: context)
10521053
if ReaderHelpers.isTopicSearchTopic(topic) {
1054+
let service = ReaderPostService(managedObjectContext: context)
10531055
service.fetchPosts(for: topic, atOffset: 0, deletingEarlier: false, success: success, failure: failure)
10541056
} else if let topic = topic as? ReaderTagTopic {
1055-
service.fetchPostsV2(for: topic, success: success, failure: failure)
1057+
self.readerPostStreamService.fetchPosts(for: topic, success: success, failure: failure)
10561058
} else {
1059+
let service = ReaderPostService(managedObjectContext: context)
10571060
service.fetchPosts(for: topic, earlierThan: Date(), success: success, failure: failure)
10581061
}
10591062
}
@@ -1168,13 +1171,14 @@ import Combine
11681171
return
11691172
}
11701173

1171-
let service = ReaderPostService(managedObjectContext: context)
11721174
if ReaderHelpers.isTopicSearchTopic(topic) {
1175+
let service = ReaderPostService(managedObjectContext: context)
11731176
let offset = UInt(self.content.contentCount)
11741177
service.fetchPosts(for: topic, atOffset: UInt(offset), deletingEarlier: false, success: success, failure: failure)
11751178
} else if let topic = topic as? ReaderTagTopic {
1176-
service.fetchPostsV2(for: topic, isFirstPage: false, success: success, failure: failure)
1179+
self.readerPostStreamService.fetchPosts(for: topic, isFirstPage: false, success: success, failure: failure)
11771180
} else {
1181+
let service = ReaderPostService(managedObjectContext: context)
11781182
let earlierThan = sortDate
11791183
service.fetchPosts(for: topic, earlierThan: earlierThan, success: success, failure: failure)
11801184
}

WordPress/WordPress.xcodeproj/project.pbxproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1929,7 +1929,7 @@
19291929
8B15CDAC27EB89AD00A75749 /* BlogDashboardPostsParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B15CDAA27EB89AC00A75749 /* BlogDashboardPostsParser.swift */; };
19301930
8B15D27428009EBF0076628A /* BlogDashboardAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B15D27328009EBF0076628A /* BlogDashboardAnalytics.swift */; };
19311931
8B15D27528009EBF0076628A /* BlogDashboardAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B15D27328009EBF0076628A /* BlogDashboardAnalytics.swift */; };
1932-
8B16CE9A25251C89007BE5A9 /* ReaderPostService+PostsV2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B16CE9925251C89007BE5A9 /* ReaderPostService+PostsV2.swift */; };
1932+
8B16CE9A25251C89007BE5A9 /* ReaderPostStreamService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B16CE9925251C89007BE5A9 /* ReaderPostStreamService.swift */; };
19331933
8B1CF00F2433902700578582 /* PasswordAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF00E2433902700578582 /* PasswordAlertController.swift */; };
19341934
8B1CF0112433E61C00578582 /* AbstractPost+TitleForVisibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */; };
19351935
8B1E62D625758AAF009A0F80 /* ActivityTypeSelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1E62D525758AAF009A0F80 /* ActivityTypeSelectorViewController.swift */; };
@@ -5144,7 +5144,7 @@
51445144
FABB26182602FC2C00C8785C /* RegisterDomainDetailsViewModel+SectionDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 436D56102117312700CEAA33 /* RegisterDomainDetailsViewModel+SectionDefinitions.swift */; };
51455145
FABB26192602FC2C00C8785C /* ActionRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F53FF3A723EA723D001AD596 /* ActionRow.swift */; };
51465146
FABB261A2602FC2C00C8785C /* AppSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFA162301CB7031A00E2E110 /* AppSettingsViewController.swift */; };
5147-
FABB261B2602FC2C00C8785C /* ReaderPostService+PostsV2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B16CE9925251C89007BE5A9 /* ReaderPostService+PostsV2.swift */; };
5147+
FABB261B2602FC2C00C8785C /* ReaderPostStreamService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B16CE9925251C89007BE5A9 /* ReaderPostStreamService.swift */; };
51485148
FABB261C2602FC2C00C8785C /* ReferrerStatsRecordValue+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 400A2C7D2217A985000A8A59 /* ReferrerStatsRecordValue+CoreDataProperties.swift */; };
51495149
FABB261E2602FC2C00C8785C /* PostCardCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57AA848E228715DA00D3C2A2 /* PostCardCell.swift */; };
51505150
FABB26202602FC2C00C8785C /* iAd.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E21C760202BBC8D00837CF5 /* iAd.framework */; };
@@ -7074,7 +7074,7 @@
70747074
8B0CE7D22481CFF8004C4799 /* ReaderDetailHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ReaderDetailHeaderView.xib; sourceTree = "<group>"; };
70757075
8B15CDAA27EB89AC00A75749 /* BlogDashboardPostsParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlogDashboardPostsParser.swift; sourceTree = "<group>"; };
70767076
8B15D27328009EBF0076628A /* BlogDashboardAnalytics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlogDashboardAnalytics.swift; sourceTree = "<group>"; };
7077-
8B16CE9925251C89007BE5A9 /* ReaderPostService+PostsV2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ReaderPostService+PostsV2.swift"; sourceTree = "<group>"; };
7077+
8B16CE9925251C89007BE5A9 /* ReaderPostStreamService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderPostStreamService.swift; sourceTree = "<group>"; };
70787078
8B1CF00E2433902700578582 /* PasswordAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordAlertController.swift; sourceTree = "<group>"; };
70797079
8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+TitleForVisibility.swift"; sourceTree = "<group>"; };
70807080
8B1E62D525758AAF009A0F80 /* ActivityTypeSelectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityTypeSelectorViewController.swift; sourceTree = "<group>"; };
@@ -13413,7 +13413,7 @@
1341313413
8BB185C524B5FB8500A4CCE8 /* ReaderCardService.swift */,
1341413414
5D3D559518F88C3500782892 /* ReaderPostService.h */,
1341513415
5D3D559618F88C3500782892 /* ReaderPostService.m */,
13416-
8B16CE9925251C89007BE5A9 /* ReaderPostService+PostsV2.swift */,
13416+
8B16CE9925251C89007BE5A9 /* ReaderPostStreamService.swift */,
1341713417
FA8E1F7625EEFA7300063673 /* ReaderPostService+RelatedPosts.swift */,
1341813418
E62079E01CF7A61200F5CD46 /* ReaderSearchSuggestionService.swift */,
1341913419
17CE77EC20C6C2F3001DEA5A /* ReaderSiteSearchService.swift */,
@@ -21730,7 +21730,7 @@
2173021730
F53FF3A823EA723D001AD596 /* ActionRow.swift in Sources */,
2173121731
FFA162311CB7031A00E2E110 /* AppSettingsViewController.swift in Sources */,
2173221732
F111B87826580FCE00057942 /* BloggingRemindersStore.swift in Sources */,
21733-
8B16CE9A25251C89007BE5A9 /* ReaderPostService+PostsV2.swift in Sources */,
21733+
8B16CE9A25251C89007BE5A9 /* ReaderPostStreamService.swift in Sources */,
2173421734
400A2C872217A985000A8A59 /* ReferrerStatsRecordValue+CoreDataProperties.swift in Sources */,
2173521735
57AA848F228715DA00D3C2A2 /* PostCardCell.swift in Sources */,
2173621736
FE43DAAF26DFAD1C00CFF595 /* CommentContentTableViewCell.swift in Sources */,
@@ -24457,7 +24457,7 @@
2445724457
9815D0B426B49A0600DF7226 /* Comment+CoreDataProperties.swift in Sources */,
2445824458
FABB261A2602FC2C00C8785C /* AppSettingsViewController.swift in Sources */,
2445924459
4A82C43228D321A300486CFF /* Blog+Post.swift in Sources */,
24460-
FABB261B2602FC2C00C8785C /* ReaderPostService+PostsV2.swift in Sources */,
24460+
FABB261B2602FC2C00C8785C /* ReaderPostStreamService.swift in Sources */,
2446124461
FABB261C2602FC2C00C8785C /* ReferrerStatsRecordValue+CoreDataProperties.swift in Sources */,
2446224462
FABB261E2602FC2C00C8785C /* PostCardCell.swift in Sources */,
2446324463
8F228B22E190FF92D05E53DB /* TimeZoneSearchHeaderView.swift in Sources */,

0 commit comments

Comments
 (0)