Fixing slow-loading bug on offline ios when loading offline stories in big folders.

This commit is contained in:
Samuel Clay 2013-07-31 18:42:18 -07:00
parent fec12ecd2d
commit ad8b03174f

View file

@ -261,6 +261,7 @@
appDelegate.hasLoadedFeedDetail = NO; appDelegate.hasLoadedFeedDetail = NO;
self.pageFetching = NO; self.pageFetching = NO;
self.pageFinished = NO; self.pageFinished = NO;
self.isOffline = NO;
self.feedPage = 1; self.feedPage = 1;
appDelegate.activeStory = nil; appDelegate.activeStory = nil;
[appDelegate.storyPageControl resetPages]; [appDelegate.storyPageControl resetPages];
@ -293,6 +294,8 @@
- (void)beginOfflineTimer { - (void)beginOfflineTimer {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
if (!appDelegate.storyLocationsCount && self.feedPage == 1) { if (!appDelegate.storyLocationsCount && self.feedPage == 1) {
self.isOffline = YES;
[self showLoadingNotifier];
[self loadOfflineStories]; [self loadOfflineStories];
} }
}); });
@ -331,6 +334,13 @@
}]; }];
}); });
} }
if (self.isOffline) {
[self loadOfflineStories];
[self showOfflineNotifier];
return;
}
if (appDelegate.isSocialView) { if (appDelegate.isSocialView) {
theFeedDetailURL = [NSString stringWithFormat:@"%@/social/stories/%@/?page=%d", theFeedDetailURL = [NSString stringWithFormat:@"%@/social/stories/%@/?page=%d",
NEWSBLUR_URL, NEWSBLUR_URL,
@ -366,6 +376,7 @@
[self showOfflineNotifier]; [self showOfflineNotifier];
} else { } else {
[self informError:[request error]]; [self informError:[request error]];
self.pageFinished = YES;
} }
[self.storyTitlesTable reloadData]; [self.storyTitlesTable reloadData];
}]; }];
@ -384,8 +395,12 @@
} }
- (void)loadOfflineStories { - (void)loadOfflineStories {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
[appDelegate.database inDatabase:^(FMDatabase *db) { [appDelegate.database inDatabase:^(FMDatabase *db) {
NSArray *feedIds; NSArray *feedIds;
int limit = 12;
int offset = (self.feedPage - 1) * limit;
if (appDelegate.isRiverView) { if (appDelegate.isRiverView) {
feedIds = appDelegate.activeFolderFeeds; feedIds = appDelegate.activeFolderFeeds;
@ -407,10 +422,11 @@
} else { } else {
readFilterSql = @""; readFilterSql = @"";
} }
NSString *sql = [NSString stringWithFormat:@"SELECT * FROM stories s %@ WHERE s.story_feed_id IN (%@) ORDER BY s.story_timestamp %@ LIMIT 500", NSString *sql = [NSString stringWithFormat:@"SELECT * FROM stories s %@ WHERE s.story_feed_id IN (%@) ORDER BY s.story_timestamp %@ LIMIT %d OFFSET %d",
readFilterSql, readFilterSql,
[feedIds componentsJoinedByString:@","], [feedIds componentsJoinedByString:@","],
orderSql]; orderSql,
limit, offset];
FMResultSet *cursor = [db executeQuery:sql]; FMResultSet *cursor = [db executeQuery:sql];
NSMutableArray *offlineStories = [NSMutableArray array]; NSMutableArray *offlineStories = [NSMutableArray array];
@ -426,28 +442,35 @@
NSString *unreadHashSql = [NSString stringWithFormat:@"SELECT s.story_hash FROM stories s INNER JOIN unread_hashes uh ON s.story_hash = uh.story_hash WHERE s.story_feed_id IN (%@)", NSString *unreadHashSql = [NSString stringWithFormat:@"SELECT s.story_hash FROM stories s INNER JOIN unread_hashes uh ON s.story_hash = uh.story_hash WHERE s.story_feed_id IN (%@)",
[feedIds componentsJoinedByString:@","]]; [feedIds componentsJoinedByString:@","]];
FMResultSet *unreadHashCursor = [db executeQuery:unreadHashSql]; FMResultSet *unreadHashCursor = [db executeQuery:unreadHashSql];
NSMutableDictionary *unreadStoryHashes = [NSMutableDictionary dictionary]; NSMutableDictionary *unreadStoryHashes;
if (self.feedPage == 1) {
unreadStoryHashes = [NSMutableDictionary dictionary];
} else {
unreadStoryHashes = self.unreadStoryHashes;
}
while ([unreadHashCursor next]) { while ([unreadHashCursor next]) {
[unreadStoryHashes setObject:[NSNumber numberWithBool:YES] forKey:[unreadHashCursor objectForColumnName:@"story_hash"]]; [unreadStoryHashes setObject:[NSNumber numberWithBool:YES] forKey:[unreadHashCursor objectForColumnName:@"story_hash"]];
} }
self.unreadStoryHashes = unreadStoryHashes;
self.unreadStoryHashes = unreadStoryHashes;
} }
if ([offlineStories count]) { dispatch_sync(dispatch_get_main_queue(), ^{
[self renderStories:offlineStories]; if (!self.isOffline) {
[self showLoadingNotifier]; NSLog(@"Online before offline rendered. Tossing offline stories.");
} else if (!self.isOffline) { return;
[self showLoadingNotifier]; }
} if (![offlineStories count]) {
self.pageFinished = YES;
} else {
[self renderStories:offlineStories];
}
});
}]; }];
});
self.pageFinished = YES;
} }
- (void)showOfflineNotifier { - (void)showOfflineNotifier {
[self.notifier hide]; // [self.notifier hide];
self.notifier.style = NBOfflineStyle; self.notifier.style = NBOfflineStyle;
self.notifier.title = @"Offline"; self.notifier.title = @"Offline";
[self.notifier show]; [self.notifier show];
@ -484,6 +507,11 @@
}); });
} }
if (self.isOffline) {
[self loadOfflineStories];
return;
}
NSString *theFeedDetailURL; NSString *theFeedDetailURL;
if (appDelegate.isSocialRiverView) { if (appDelegate.isSocialRiverView) {
@ -526,7 +554,6 @@
[request setResponseEncoding:NSUTF8StringEncoding]; [request setResponseEncoding:NSUTF8StringEncoding];
[request setDefaultResponseEncoding:NSUTF8StringEncoding]; [request setDefaultResponseEncoding:NSUTF8StringEncoding];
[request setFailedBlock:^(void) { [request setFailedBlock:^(void) {
self.pageFinished = YES;
if (request.isCancelled) { if (request.isCancelled) {
NSLog(@"Cancelled"); NSLog(@"Cancelled");
return; return;
@ -537,6 +564,7 @@
} else { } else {
[self informError:[request error]]; [self informError:[request error]];
[self.storyTitlesTable reloadData]; [self.storyTitlesTable reloadData];
self.pageFinished = YES;
} }
}]; }];
[request setCompletionBlock:^(void) { [request setCompletionBlock:^(void) {
@ -558,7 +586,6 @@
NSLog(@"Cancelled"); NSLog(@"Cancelled");
return; return;
} else if ([request responseStatusCode] >= 500) { } else if ([request responseStatusCode] >= 500) {
self.pageFinished = YES;
if (self.feedPage == 1) { if (self.feedPage == 1) {
self.isOffline = YES; self.isOffline = YES;
[self loadOfflineStories]; [self loadOfflineStories];
@ -566,6 +593,7 @@
} }
if ([request responseStatusCode] == 503) { if ([request responseStatusCode] == 503) {
[self informError:@"In maintenance mode"]; [self informError:@"In maintenance mode"];
self.pageFinished = YES;
} else { } else {
[self informError:@"The server barfed."]; [self informError:@"The server barfed."];
} }