mirror of
https://github.com/viq/NewsBlur.git
synced 2025-09-18 21:43:31 +00:00
Queueing read stories and sending them on feed load or feed list load.
This commit is contained in:
parent
be5c9fe389
commit
e7ab50e8a5
6 changed files with 111 additions and 27 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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 -
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue