Queueing read stories and sending them on feed load or feed list load.

This commit is contained in:
Samuel Clay 2013-06-16 08:15:40 -07:00
parent be5c9fe389
commit e7ab50e8a5
6 changed files with 111 additions and 27 deletions

View file

@ -88,6 +88,7 @@
BOOL inFeedDetail;
BOOL inStoryDetail;
BOOL inFindingStoryMode;
BOOL hashQueuedReadStories;
NSString *tryFeedStoryId;
NSDictionary * activeFeed;
NSMutableDictionary * activeClassifiers;
@ -173,6 +174,7 @@
@property (nonatomic, readwrite) BOOL isSocialRiverView;
@property (nonatomic, readwrite) BOOL isTryFeedView;
@property (nonatomic, readwrite) BOOL inFindingStoryMode;
@property (nonatomic, readwrite) BOOL hasQueuedReadStories;
@property (nonatomic) NSString *tryFeedStoryId;
@property (nonatomic) NSString *tryFeedCategory;
@property (nonatomic, readwrite) BOOL popoverHasFeedView;
@ -319,6 +321,8 @@
- (void)fetchAllUnreadStories;
- (void)fetchAllUnreadStories:(int)page;
- (void)storeAllUnreadStories:(ASIHTTPRequest *)request;
- (void)flushQueuedReadStories:(BOOL)forceCheck;
- (void)syncQueuedReadStories:(FMDatabase *)db withStories:(NSDictionary *)hashes;
@end

View file

@ -90,6 +90,7 @@
@synthesize isTryFeedView;
@synthesize inFindingStoryMode;
@synthesize hasQueuedReadStories;
@synthesize tryFeedStoryId;
@synthesize tryFeedCategory;
@synthesize popoverHasFeedView;
@ -519,6 +520,7 @@
[feedDetailViewController resetFeedDetail];
[feedDetailViewController fetchFeedDetail:1 withCallback:nil];
[self flushQueuedReadStories:NO];
}
- (void)loadTryFeedDetailView:(NSString *)feedId
@ -2154,6 +2156,55 @@
}
}
- (void)flushQueuedReadStories:(BOOL)forceCheck {
if (hasQueuedReadStories || forceCheck) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
[self.database inTransaction:^(FMDatabase *db, BOOL *rollback) {
NSMutableDictionary *hashes = [NSMutableDictionary dictionary];
FMResultSet *stories = [db executeQuery:@"SELECT * FROM queued_read_hashes"];
while ([stories next]) {
NSString *storyFeedId = [NSString stringWithFormat:@"%@", [stories objectForColumnName:@"story_feed_id"]];
NSString *storyHash = [stories objectForColumnName:@"story_hash"];
if (![hashes objectForKey:storyFeedId]) {
[hashes setObject:[NSMutableArray array] forKey:storyFeedId];
}
[[hashes objectForKey:storyFeedId] addObject:storyHash];
}
if ([[hashes allKeys] count]) {
hasQueuedReadStories = NO;
[self syncQueuedReadStories:db withStories:hashes];
}
}];
});
}
}
- (void)syncQueuedReadStories:(FMDatabase *)db withStories:(NSDictionary *)hashes {
NSString *urlString = [NSString stringWithFormat:@"http://%@/reader/mark_feed_stories_as_read",
NEWSBLUR_URL];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableArray *completedHashes = [NSMutableArray array];
for (NSArray *storyHashes in [hashes allValues]) {
[completedHashes addObjectsFromArray:storyHashes];
}
NSString *completedHashesStr = [completedHashes componentsJoinedByString:@"\",\""];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:[hashes JSONRepresentation] forKey:@"feeds_stories"];
[request setDelegate:self];
[request setCompletionBlock:^{
NSLog(@"Completed clearing %@ hashes", completedHashesStr);
[db executeUpdate:[NSString stringWithFormat:@"DELETE FROM queued_read_hashes WHERE story_hash in (\"%@\")", completedHashesStr]]
;
}];
[request setFailedBlock:^{
NSLog(@"Failed mark read queued.");
hasQueuedReadStories = YES;
}];
[request startAsynchronous];
}
@end
#pragma mark -

View file

@ -411,7 +411,7 @@ static const CGFloat kFolderTitleHeight = 28;
if (self.inPullToRefresh_) {
urlFeedList = [NSURL URLWithString:
[NSString stringWithFormat:@"http://%@/reader/feeds?flat=true",
[NSString stringWithFormat:@"http://%@/reader/feeds?flat=true&update_counts=true",
NEWSBLUR_URL]];
} else {
urlFeedList = [NSURL URLWithString:
@ -1471,6 +1471,7 @@ heightForHeaderInSection:(NSInteger)section {
[appDelegate.folderCountCache removeAllObjects];
[self.feedTitlesTable reloadData];
[self refreshHeaderCounts];
[self.appDelegate flushQueuedReadStories:YES];
[self.appDelegate fetchUnreadHashes];
}

View file

@ -92,19 +92,19 @@
- (void)changePage:(NSInteger)pageIndex;
- (void)changePage:(NSInteger)pageIndex animated:(BOOL)animated;
- (void)requestFailed:(ASIHTTPRequest *)request;
- (void)requestFailedMarkStoryRead:(ASIHTTPRequest *)request;
- (void)requestFailedMarkStoryRead:(ASIFormDataRequest *)request;
- (void)setNextPreviousButtons;
- (void)setTextButton;
- (void)markStoryAsRead;
- (void)finishMarkAsRead:(ASIHTTPRequest *)request;
- (void)finishMarkAsRead:(ASIFormDataRequest *)request;
- (void)openSendToDialog;
- (void)markStoryAsUnread;
- (void)finishMarkAsUnread:(ASIHTTPRequest *)request;
- (void)finishMarkAsUnread:(ASIFormDataRequest *)request;
- (void)markStoryAsSaved;
- (void)finishMarkAsSaved:(ASIHTTPRequest *)request;
- (void)finishMarkAsSaved:(ASIFormDataRequest *)request;
- (void)markStoryAsUnsaved;
- (void)finishMarkAsUnsaved:(ASIHTTPRequest *)request;
- (void)finishMarkAsUnsaved:(ASIFormDataRequest *)request;
- (void)subscribeToBlurblog;
- (IBAction)toggleFontSize:(id)sender;

View file

@ -26,6 +26,7 @@
#import "UIBarButtonItem+Image.h"
#import "ShareThis.h"
#import "THCircularProgressView.h"
#import "FMDatabase.h"
@implementation StoryPageControl
@ -641,8 +642,18 @@
[self informError:error];
}
- (void)requestFailedMarkStoryRead:(ASIHTTPRequest *)request {
[self informError:@"Failed to mark story as read"];
- (void)requestFailedMarkStoryRead:(ASIFormDataRequest *)request {
// [self informError:@"Failed to mark story as read"];
NSString *storyFeedId = [request.userInfo objectForKey:@"story_feed_id"];
NSString *storyHash = [request.userInfo objectForKey:@"story_hash"];
[appDelegate.database inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO queued_read_hashes "
"(story_feed_id, story_hash) VALUES "
"(?, ?)", storyFeedId, storyHash];
}];
appDelegate.hasQueuedReadStories = YES;
}
@ -758,11 +769,15 @@
[request setPostValue:[usersFeedsStories JSONRepresentation] forKey:@"users_feeds_stories"];
} else {
[request setPostValue:[appDelegate.activeStory
objectForKey:@"id"]
objectForKey:@"story_hash"]
forKey:@"story_id"];
[request setPostValue:[appDelegate.activeStory
objectForKey:@"story_feed_id"]
forKey:@"feed_id"];
[request setUserInfo:@{@"story_feed_id":[appDelegate.activeStory
objectForKey:@"story_feed_id"],
@"story_hash":[appDelegate.activeStory
objectForKey:@"story_hash"]}];
}
[request setDidFinishSelector:@selector(finishMarkAsRead:)];
@ -773,7 +788,7 @@
}
- (void)finishMarkAsRead:(ASIHTTPRequest *)request {
- (void)finishMarkAsRead:(ASIFormDataRequest *)request {
if ([request responseStatusCode] != 200) {
return [self requestFailedMarkStoryRead:request];
}
@ -803,7 +818,7 @@
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:[appDelegate.activeStory
objectForKey:@"id"]
objectForKey:@"story_hash"]
forKey:@"story_id"];
[request setPostValue:[appDelegate.activeStory
objectForKey:@"story_feed_id"]
@ -815,7 +830,7 @@
[request startAsynchronous];
}
- (void)finishMarkAsSaved:(ASIHTTPRequest *)request {
- (void)finishMarkAsSaved:(ASIFormDataRequest *)request {
if ([request responseStatusCode] != 200) {
return [self requestFailed:request];
}
@ -833,7 +848,7 @@
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:[appDelegate.activeStory
objectForKey:@"id"]
objectForKey:@"story_hash"]
forKey:@"story_id"];
[request setPostValue:[appDelegate.activeStory
objectForKey:@"story_feed_id"]
@ -845,7 +860,7 @@
[request startAsynchronous];
}
- (void)finishMarkAsUnsaved:(ASIHTTPRequest *)request {
- (void)finishMarkAsUnsaved:(ASIFormDataRequest *)request {
if ([request responseStatusCode] != 200) {
return [self requestFailed:request];
}
@ -865,7 +880,7 @@
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:[appDelegate.activeStory
objectForKey:@"id"]
objectForKey:@"story_hash"]
forKey:@"story_id"];
[request setPostValue:[appDelegate.activeStory
objectForKey:@"story_feed_id"]
@ -878,7 +893,7 @@
}
}
- (void)finishMarkAsUnread:(ASIHTTPRequest *)request {
- (void)finishMarkAsUnread:(ASIFormDataRequest *)request {
if ([request responseStatusCode] != 200) {
return [self requestFailed:request];
}

View file

@ -8,11 +8,11 @@
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Classes/StoryPageControl.m"
timestampString = "391646314.984237"
timestampString = "393035984.441484"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "301"
endingLineNumber = "301"
startingLineNumber = "302"
endingLineNumber = "302"
landmarkName = "-resizeScrollView"
landmarkType = "5">
</FileBreakpoint>
@ -21,27 +21,40 @@
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Classes/NewsBlurAppDelegate.m"
timestampString = "393035025.753053"
timestampString = "393041779.344441"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "714"
endingLineNumber = "714"
landmarkName = "@implementation NewsBlurAppDelegate"
landmarkType = "3">
startingLineNumber = "715"
endingLineNumber = "715"
landmarkName = "-recalculateIntelligenceScores:"
landmarkType = "5">
</FileBreakpoint>
<FileBreakpoint
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Classes/StoryPageControl.m"
timestampString = "391646314.984237"
timestampString = "393041779.344441"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "995"
endingLineNumber = "995"
startingLineNumber = "1010"
endingLineNumber = "1010"
landmarkName = "-doNextUnreadStory"
landmarkType = "5">
</FileBreakpoint>
<FileBreakpoint
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Classes/NewsBlurViewController.m"
timestampString = "393043837.427452"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "889"
endingLineNumber = "889"
landmarkName = "-tableView:didSelectRowAtIndexPath:"
landmarkType = "5">
</FileBreakpoint>
</FileBreakpoints>
<SymbolicBreakpoints>
<SymbolicBreakpoint