diff --git a/clients/ios/Classes/ActivityModule.m b/clients/ios/Classes/ActivityModule.m index 7e9983506..960467240 100644 --- a/clients/ios/Classes/ActivityModule.m +++ b/clients/ios/Classes/ActivityModule.m @@ -99,7 +99,7 @@ [appDelegate.dictSocialProfile objectForKey:@"user_id"], page]; - [appDelegate.manager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + [appDelegate.networkManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [self finishLoadActivities:responseObject]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [appDelegate informError:error]; diff --git a/clients/ios/Classes/AuthorizeServicesViewController.m b/clients/ios/Classes/AuthorizeServicesViewController.m index e9b60576b..0a598cb12 100644 --- a/clients/ios/Classes/AuthorizeServicesViewController.m +++ b/clients/ios/Classes/AuthorizeServicesViewController.m @@ -100,13 +100,7 @@ }]; } else { [self.navigationController popViewControllerAnimated:YES]; - if ([type isEqualToString:@"google"]) { - if (error.length) { - [appDelegate.firstTimeUserAddSitesViewController importFromGoogleReaderFailed:error]; - } else { - [appDelegate.firstTimeUserAddSitesViewController importFromGoogleReader]; - } - } else if ([type isEqualToString:@"facebook"]) { + if ([type isEqualToString:@"facebook"]) { if (error.length) { [self showError:error]; } else { diff --git a/clients/ios/Classes/FeedDetailViewController.m b/clients/ios/Classes/FeedDetailViewController.m index 39bae4b8f..9d5eaa539 100644 --- a/clients/ios/Classes/FeedDetailViewController.m +++ b/clients/ios/Classes/FeedDetailViewController.m @@ -31,7 +31,6 @@ #import "NBBarButtonItem.h" #import "UIImage+Resize.h" #import "TMCache.h" -#import "AFHTTPRequestOperation.h" #import "DashboardViewController.h" #import "StoriesCollection.h" #import "NSNull+JSON.h" @@ -565,36 +564,35 @@ - (void)cacheStoryImages:(NSArray *)storyImageUrls { NSBlockOperation *cacheImagesOperation = [NSBlockOperation blockOperationWithBlock:^{ for (NSString *storyImageUrl in storyImageUrls) { -// NSLog(@"Fetching image: %@", storyImageUrl); - NSMutableURLRequest *request = [NSMutableURLRequest - requestWithURL:[NSURL URLWithString:storyImageUrl]]; - [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; - [request setTimeoutInterval:5.0]; - AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperation alloc] - initWithRequest:request]; - [requestOperation setResponseSerializer:[AFImageResponseSerializer serializer]]; - [requestOperation start]; - [requestOperation waitUntilFinished]; + NSLog(@"Fetching image: %@", storyImageUrl); + AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; + [manager.requestSerializer setTimeoutInterval:5]; + manager.responseSerializer = [AFImageResponseSerializer serializer]; - UIImage *image = (UIImage *)requestOperation.responseObject; - - if (!image || image.size.height < 50 || image.size.width < 50) { - [appDelegate.cachedStoryImages setObject:[NSNull null] + [manager GET:storyImageUrl parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + UIImage *image = (UIImage *)responseObject; + + if (!image || image.size.height < 50 || image.size.width < 50) { + [appDelegate.cachedStoryImages setObject:[NSNull null] + forKey:storyImageUrl]; +// continue; + return; + } + + CGSize maxImageSize = CGSizeMake(300, 300); + image = [image imageByScalingAndCroppingForSize:maxImageSize]; + [appDelegate.cachedStoryImages setObject:image forKey:storyImageUrl]; - continue; - } - - CGSize maxImageSize = CGSizeMake(300, 300); - image = [image imageByScalingAndCroppingForSize:maxImageSize]; - [appDelegate.cachedStoryImages setObject:image - forKey:storyImageUrl]; - if (self.isDashboardModule) { - [appDelegate.dashboardViewController.storiesModule - showStoryImage:storyImageUrl]; - } else { - [appDelegate.feedDetailViewController - showStoryImage:storyImageUrl]; - } + if (self.isDashboardModule) { + [appDelegate.dashboardViewController.storiesModule + showStoryImage:storyImageUrl]; + } else { + [appDelegate.feedDetailViewController + showStoryImage:storyImageUrl]; + } + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + }]; } }]; [cacheImagesOperation setQualityOfService:NSQualityOfServiceBackground]; diff --git a/clients/ios/Classes/InteractionsModule.m b/clients/ios/Classes/InteractionsModule.m index b57c84954..0a5e9a0a5 100644 --- a/clients/ios/Classes/InteractionsModule.m +++ b/clients/ios/Classes/InteractionsModule.m @@ -30,7 +30,7 @@ { self = [super initWithFrame:frame]; if (self) { - + appDelegate = (NewsBlurAppDelegate *)[[UIApplication sharedApplication] delegate]; } return self; } @@ -73,8 +73,6 @@ #pragma mark Get Interactions - (void)fetchInteractionsDetail:(int)page { - self.appDelegate = (NewsBlurAppDelegate *)[[UIApplication sharedApplication] delegate]; - // if there is no social profile, we are DONE // if ([[appDelegate.dictSocialProfile allKeys] count] == 0) { // self.pageFinished = YES; @@ -103,11 +101,11 @@ [appDelegate.dictSocialProfile objectForKey:@"user_id"], page]; - appDelegate.manager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + [appDelegate.networkManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [self finishLoadInteractions:responseObject]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [appDelegate informError:error]; - } + }]; } } diff --git a/clients/ios/Classes/NewsBlurAppDelegate.h b/clients/ios/Classes/NewsBlurAppDelegate.h index 91838894a..94d253f72 100644 --- a/clients/ios/Classes/NewsBlurAppDelegate.h +++ b/clients/ios/Classes/NewsBlurAppDelegate.h @@ -112,16 +112,16 @@ SFSafariViewControllerDelegate> { NSURL * activeOriginalStoryURL; NSString * activeShareType; NSDictionary * activeComment; - int feedDetailPortraitYCoordinate; - int originalStoryCount; + NSInteger feedDetailPortraitYCoordinate; + NSInteger originalStoryCount; NSInteger selectedIntelligence; - int savedStoriesCount; - int totalUnfetchedStoryCount; - int remainingUnfetchedStoryCount; - int latestFetchedStoryDate; - int latestCachedImageDate; - int totalUncachedImagesCount; - int remainingUncachedImagesCount; + NSInteger savedStoriesCount; + NSInteger totalUnfetchedStoryCount; + NSInteger remainingUnfetchedStoryCount; + NSInteger latestFetchedStoryDate; + NSInteger latestCachedImageDate; + NSInteger totalUncachedImagesCount; + NSInteger remainingUncachedImagesCount; NSMutableDictionary * recentlyReadStories; NSMutableSet * recentlyReadFeeds; NSMutableArray * readStories; @@ -221,15 +221,15 @@ SFSafariViewControllerDelegate> { @property (readwrite) NSURL * activeOriginalStoryURL; @property (readwrite) NSDictionary * activeComment; @property (readwrite) NSString * activeShareType; -@property (readwrite) int feedDetailPortraitYCoordinate; -@property (readwrite) int originalStoryCount; -@property (readwrite) int savedStoriesCount; -@property (readwrite) int totalUnfetchedStoryCount; -@property (readwrite) int remainingUnfetchedStoryCount; -@property (readwrite) int totalUncachedImagesCount; -@property (readwrite) int remainingUncachedImagesCount; -@property (readwrite) int latestFetchedStoryDate; -@property (readwrite) int latestCachedImageDate; +@property (readwrite) NSInteger feedDetailPortraitYCoordinate; +@property (readwrite) NSInteger originalStoryCount; +@property (readwrite) NSInteger savedStoriesCount; +@property (readwrite) NSInteger totalUnfetchedStoryCount; +@property (readwrite) NSInteger remainingUnfetchedStoryCount; +@property (readwrite) NSInteger totalUncachedImagesCount; +@property (readwrite) NSInteger remainingUncachedImagesCount; +@property (readwrite) NSInteger latestFetchedStoryDate; +@property (readwrite) NSInteger latestCachedImageDate; @property (readwrite) NSInteger selectedIntelligence; @property (readwrite) NSMutableDictionary * recentlyReadStories; @property (readwrite) NSMutableSet * recentlyReadFeeds; diff --git a/clients/ios/Classes/NewsBlurAppDelegate.m b/clients/ios/Classes/NewsBlurAppDelegate.m index 0fae1a231..990bc9e11 100644 --- a/clients/ios/Classes/NewsBlurAppDelegate.m +++ b/clients/ios/Classes/NewsBlurAppDelegate.m @@ -29,7 +29,6 @@ #import "FontSettingsViewController.h" #import "FeedChooserViewController.h" #import "UserProfileViewController.h" -#import "AFHTTPRequestOperation.h" #import "InteractionsModule.h" #import "ActivityModule.h" #import "FirstTimeUserViewController.h" @@ -424,31 +423,14 @@ } NSLog(@" -> APNS token: %@", token); - NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/notifications/apns_token/", - self.url]]; - ASIFormDataRequest *_request = [ASIFormDataRequest requestWithURL:url]; - __weak ASIFormDataRequest *request = _request; - [request setValidatesSecureCertificate:NO]; - [request setResponseEncoding:NSUTF8StringEncoding]; - [request setDefaultResponseEncoding:NSUTF8StringEncoding]; - [params setObject:token - forKey:@"apns_token"]; - [request setFailedBlock:^(void) { + NSString *url = [NSString stringWithFormat:@"%@/notifications/apns_token/", self.url]; + NSMutableDictionary *params = [NSMutableDictionary dictionary]; + [params setObject:token forKey:@"apns_token"]; + [networkManager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + NSLog(@" -> APNS: %@", responseObject); + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"Failed to set APNS token"); }]; - [request setCompletionBlock:^(void) { - NSString *responseString = [request responseString]; - NSData *responseData=[responseString dataUsingEncoding:NSUTF8StringEncoding]; - NSError *error; - NSDictionary *results = [NSJSONSerialization - JSONObjectWithData:responseData - options:kNilOptions - error:&error]; - NSLog(@" -> APNS: %@/%@", results, error); - }]; - [request setTimeOutSeconds:30]; - [request startAsynchronous]; - } - (BOOL)application:(UIApplication *)application @@ -1287,7 +1269,7 @@ NSLog(@"Logging out..."); NSString *urlString = [NSString stringWithFormat:@"%@/reader/logout?api=1", self.url]; - [appDelegate.networkManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + [networkManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [MBProgressHUD hideHUDForView:self.view animated:YES]; [self showLogin]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { @@ -1325,7 +1307,7 @@ - (void)refreshUserProfile:(void(^)())callback { NSString *urlString = [NSString stringWithFormat:@"%@/social/load_user_profile", self.url]; - [appDelegate.networkManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + [networkManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { self.dictUserProfile = [responseObject objectForKey:@"user_profile"]; self.dictSocialServices = [responseObject objectForKey:@"services"]; callback(); @@ -2109,42 +2091,34 @@ - (void)markStoryAsRead:(NSString *)storyHash inFeed:(NSString *)feed withCallback:(void(^)())callback { NSString *urlString = [NSString stringWithFormat:@"%@/reader/mark_story_hashes_as_read", self.url]; - NSURL *url = [NSURL URLWithString:urlString]; - __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; - [params setObject:storyHash - forKey:@"story_hash"]; - [request setCompletionBlock:^{ + NSMutableDictionary *params = [NSMutableDictionary dictionary]; + [params setObject:storyHash forKey:@"story_hash"]; + + [networkManager POST:urlString parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"Marked as read: %@", storyHash); callback(); - }]; - [request setFailedBlock:^{ + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"Failed marked as read, queueing: %@", storyHash); NSMutableDictionary *stories = [NSMutableDictionary dictionary]; [stories setObject:@[storyHash] forKey:feed]; [self queueReadStories:stories]; callback(); }]; - [request setDelegate:self]; - [request startAsynchronous]; } - (void)markStoryAsStarred:(NSString *)storyHash withCallback:(void(^)())callback { NSString *urlString = [NSString stringWithFormat:@"%@/reader/mark_story_hash_as_starred", self.url]; - NSURL *url = [NSURL URLWithString:urlString]; - __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; - [params setObject:storyHash - forKey:@"story_hash"]; - [request setCompletionBlock:^{ + NSMutableDictionary *params = [NSMutableDictionary dictionary]; + [params setObject:storyHash forKey:@"story_hash"]; + + [networkManager POST:urlString parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"Marked as starred: %@", storyHash); callback(); - }]; - [request setFailedBlock:^{ + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"Failed marked as starred: %@", storyHash); callback(); }]; - [request setDelegate:self]; - [request startAsynchronous]; } - (void)markStoriesRead:(NSDictionary *)stories inFeeds:(NSArray *)feeds cutoffTimestamp:(NSInteger)cutoff { @@ -2193,18 +2167,6 @@ } } -- (void)requestFailedMarkStoryRead:(NSError *)error { - // [self informError:@"Failed to mark story as read"]; - NSArray *feedIds = [request.userInfo objectForKey:@"feeds"]; - NSDictionary *stories = [request.userInfo objectForKey:@"stories"]; - - [self markStoriesRead:stories inFeeds:feedIds cutoffTimestamp:0]; -} - -- (void)finishMarkAllAsRead:(NSDictionary *)params { - -} - - (void)finishMarkAsRead:(NSDictionary *)story { if (!storyPageControl.previousPage || !storyPageControl.currentPage || !storyPageControl.nextPage) return; for (StoryDetailViewController *page in @[storyPageControl.previousPage, @@ -2817,6 +2779,22 @@ #pragma mark - #pragma mark Classifiers +- (void)failedClassifierSave:(NSURLSessionDataTask *)task { + BaseViewController *view; + if (self.trainerViewController.isViewLoaded && self.trainerViewController.view.window) { + view = self.trainerViewController; + } else { + view = self.storyPageControl.currentPage; + } + + NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response; + if (response.statusCode == 503) { + [view informError:@"In maintenance mode"]; + } else { + [view informError:@"The server barfed!"]; + } +} + - (void)toggleAuthorClassifier:(NSString *)author feedId:(NSString *)feedId { int authorScore = [[[[storiesCollection.activeClassifiers objectForKey:feedId] objectForKey:@"authors"] @@ -2841,23 +2819,19 @@ NSString *urlString = [NSString stringWithFormat:@"%@/classifier/save", self.url]; - NSURL *url = [NSURL URLWithString:urlString]; - __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; - __weak ASIFormDataRequest *_request = request; + NSMutableDictionary *params = [NSMutableDictionary dictionary]; [params setObject:author - forKey:authorScore >= 1 ? @"like_author" : - authorScore <= -1 ? @"dislike_author" : - @"remove_like_author"]; + forKey:authorScore >= 1 ? @"like_author" : + authorScore <= -1 ? @"dislike_author" : + @"remove_like_author"]; [params setObject:feedId forKey:@"feed_id"]; - [request setCompletionBlock:^{ - [self.feedsViewController refreshFeedList:feedId]; - }]; - [request setFailedBlock:^{ - [self requestClassifierResponse:_request withFeed:feedId]; - }]; - [request setDelegate:self]; - [request startAsynchronous]; + [networkManager POST:urlString parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + [self.feedsViewController refreshFeedList:feedId]; + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + [self failedClassifierSave:task]; + }]; + [self recalculateIntelligenceScores:feedId]; [self.feedDetailViewController.storyTitlesTable reloadData]; } @@ -2889,22 +2863,18 @@ NSString *urlString = [NSString stringWithFormat:@"%@/classifier/save", self.url]; - NSURL *url = [NSURL URLWithString:urlString]; - __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; - __weak ASIFormDataRequest *_request = request; + NSMutableDictionary *params = [NSMutableDictionary dictionary]; [params setObject:tag - forKey:tagScore >= 1 ? @"like_tag" : - tagScore <= -1 ? @"dislike_tag" : - @"remove_like_tag"]; + forKey:tagScore >= 1 ? @"like_tag" : + tagScore <= -1 ? @"dislike_tag" : + @"remove_like_tag"]; [params setObject:feedId forKey:@"feed_id"]; - [request setCompletionBlock:^{ + + [networkManager POST:urlString parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [self.feedsViewController refreshFeedList:feedId]; + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + [self failedClassifierSave:task]; }]; - [request setFailedBlock:^{ - [self requestClassifierResponse:_request withFeed:feedId]; - }]; - [request setDelegate:self]; - [request startAsynchronous]; [self recalculateIntelligenceScores:feedId]; [self.feedDetailViewController.storyTitlesTable reloadData]; @@ -2941,23 +2911,19 @@ NSString *urlString = [NSString stringWithFormat:@"%@/classifier/save", self.url]; - NSURL *url = [NSURL URLWithString:urlString]; - __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; - __weak ASIFormDataRequest *_request = request; + NSMutableDictionary *params = [NSMutableDictionary dictionary]; [params setObject:title - forKey:titleScore >= 1 ? @"like_title" : - titleScore <= -1 ? @"dislike_title" : - @"remove_like_title"]; + forKey:titleScore >= 1 ? @"like_title" : + titleScore <= -1 ? @"dislike_title" : + @"remove_like_title"]; [params setObject:feedId forKey:@"feed_id"]; - [request setCompletionBlock:^{ - [self.feedsViewController refreshFeedList:feedId]; - }]; - [request setFailedBlock:^{ - [self requestClassifierResponse:_request withFeed:feedId]; - }]; - [request setDelegate:self]; - [request startAsynchronous]; + [networkManager POST:urlString parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + [self.feedsViewController refreshFeedList:feedId]; + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + [self failedClassifierSave:task]; + }]; + [self recalculateIntelligenceScores:feedId]; [self.feedDetailViewController.storyTitlesTable reloadData]; } diff --git a/clients/ios/Classes/NewsBlurViewController.m b/clients/ios/Classes/NewsBlurViewController.m index 86b397324..5329eac36 100644 --- a/clients/ios/Classes/NewsBlurViewController.m +++ b/clients/ios/Classes/NewsBlurViewController.m @@ -20,7 +20,6 @@ #import "UserProfileViewController.h" #import "StoryDetailViewController.h" #import "StoryPageControl.h" -#import "AFHTTPRequestOperation.h" #import "MBProgressHUD.h" #import "Base64.h" #import "SBJson4.h" diff --git a/clients/ios/Classes/StoriesCollection.m b/clients/ios/Classes/StoriesCollection.m index 4bd8080ad..2eb15f7cb 100644 --- a/clients/ios/Classes/StoriesCollection.m +++ b/clients/ios/Classes/StoriesCollection.m @@ -726,7 +726,8 @@ [appDelegate.networkManager POST:urlString parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [self finishMarkAsSaved:responseObject withParams:params]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { - [appDelegate informError:error]; + [self markStory:params asSaved:NO]; + [appDelegate failedMarkAsSaved:params]; }]; } @@ -743,33 +744,22 @@ appDelegate.dictFolders = allFolders; } -- (void)failedMarkAsSaved:(NSURLResponse *)response { - [self markStory:request.userInfo asSaved:NO]; - - [appDelegate failedMarkAsSaved:response]; -} - -- (void)syncStoryAsUnsaved:(NSDictionary *)story { +- (void)syncStoryAsUnsaved:(NSDictionary *)story { NSString *urlString = [NSString stringWithFormat:@"%@/reader/mark_story_as_unstarred", self.appDelegate.url]; - NSURL *url = [NSURL URLWithString:urlString]; - ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; - + NSMutableDictionary *params = [NSMutableDictionary dictionary]; [params setObject:[story - objectForKey:@"story_hash"] - forKey:@"story_id"]; + objectForKey:@"story_hash"] + forKey:@"story_id"]; [params setObject:[story - objectForKey:@"story_feed_id"] - forKey:@"feed_id"]; - - [request setDidFinishSelector:@selector(finishMarkAsUnsaved:)]; - [request setDidFailSelector:@selector(requestFailed:)]; - [request setUserInfo:@{@"story_feed_id":[story - objectForKey:@"story_feed_id"], - @"story_hash":[story - objectForKey:@"story_hash"]}]; - [request setDelegate:self]; - [request startAsynchronous]; + objectForKey:@"story_feed_id"] + forKey:@"feed_id"]; + [appDelegate.networkManager POST:urlString parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + [self finishMarkAsUnsaved:responseObject withParams:params]; + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + [self markStory:params asSaved:YES]; + [appDelegate failedMarkAsUnsaved:params]; + }]; } - (void)finishMarkAsUnsaved:(NSDictionary *)results withParams:(NSDictionary *)params { diff --git a/clients/ios/Classes/StoryDetailViewController.m b/clients/ios/Classes/StoryDetailViewController.m index 0dc190cc9..3ba58bc45 100644 --- a/clients/ios/Classes/StoryDetailViewController.m +++ b/clients/ios/Classes/StoryDetailViewController.m @@ -15,7 +15,6 @@ #import "UserProfileViewController.h" #import "ShareViewController.h" #import "StoryPageControl.h" -#import "AFHTTPRequestOperation.h" #import "Base64.h" #import "Utilities.h" #import "NSString+HTML.h" @@ -1979,10 +1978,9 @@ shouldStartLoadWithRequest:(NSURLRequest *)request @"Copying..." : @"Saving..."]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; - AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperation alloc] - initWithRequest:urlRequest]; - [requestOperation setResponseSerializer:[AFImageResponseSerializer serializer]]; - [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; + [manager setResponseSerializer:[AFImageResponseSerializer serializer]]; + [manager GET:url.absoluteString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { UIImage *image = responseObject; if (buttonIndex == actionSheetCopyImageIndex) { [UIPasteboard generalPasteboard].image = image; @@ -1991,11 +1989,10 @@ shouldStartLoadWithRequest:(NSURLRequest *)request UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); [self flashCheckmarkHud:@"saved"]; } - } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [MBProgressHUD hideHUDForView:self.webView animated:YES]; [self informError:@"Could not fetch image"]; }]; - [requestOperation start]; } - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { diff --git a/clients/ios/Classes/StoryPageControl.h b/clients/ios/Classes/StoryPageControl.h index e47fcc7e7..d92563094 100644 --- a/clients/ios/Classes/StoryPageControl.h +++ b/clients/ios/Classes/StoryPageControl.h @@ -10,10 +10,11 @@ #import "BaseViewController.h" #import "THCircularProgressView.h" #import "NBNotifier.h" +#import "StoryDetailViewController.h" @interface StoryPageControl : BaseViewController { - + NewsBlurAppDelegate *appDelegate; THCircularProgressView *circularProgressView; UIButton *buttonPrevious; UIButton *buttonNext; diff --git a/clients/ios/Classes/StoryPageControl.m b/clients/ios/Classes/StoryPageControl.m index f4e1ab6c0..6f648b411 100644 --- a/clients/ios/Classes/StoryPageControl.m +++ b/clients/ios/Classes/StoryPageControl.m @@ -27,7 +27,6 @@ @implementation StoryPageControl -@synthesize appDelegate; @synthesize currentPage, nextPage, previousPage; @synthesize circularProgressView; @synthesize separatorBarButton; @@ -65,6 +64,7 @@ - (void)viewDidLoad { [super viewDidLoad]; + appDelegate = [NewsBlurAppDelegate sharedAppDelegate]; currentPage = [[StoryDetailViewController alloc] initWithNibName:@"StoryDetailViewController" bundle:nil]; @@ -557,7 +557,7 @@ } - (BOOL)isPhoneOrCompact { - return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone || self.appDelegate.isCompactWidth; + return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone || appDelegate.isCompactWidth; } - (void)updateTraverseBackground { @@ -621,15 +621,15 @@ if (newIndex > 0 && newIndex >= [appDelegate.storiesCollection.activeFeedStoryLocations count]) { pageController.pageIndex = -2; - if (self.appDelegate.storiesCollection.feedPage < 100 && - !self.appDelegate.feedDetailViewController.pageFinished && - !self.appDelegate.feedDetailViewController.pageFetching) { - [self.appDelegate.feedDetailViewController fetchNextPage:^() { + if (appDelegate.storiesCollection.feedPage < 100 && + !appDelegate.feedDetailViewController.pageFinished && + !appDelegate.feedDetailViewController.pageFetching) { + [appDelegate.feedDetailViewController fetchNextPage:^() { // NSLog(@"Fetched next page, %d stories", [appDelegate.activeFeedStoryLocations count]); [self applyNewIndex:newIndex pageController:pageController]; }]; - } else if (!self.appDelegate.feedDetailViewController.pageFinished && - !self.appDelegate.feedDetailViewController.pageFetching) { + } else if (!appDelegate.feedDetailViewController.pageFinished && + !appDelegate.feedDetailViewController.pageFetching) { [appDelegate.navigationController popToViewController:[appDelegate.navigationController.viewControllers objectAtIndex:0] @@ -979,7 +979,7 @@ buttonNext.enabled = YES; NSInteger nextIndex = [appDelegate.storiesCollection indexOfNextUnreadStory]; NSInteger unreadCount = [appDelegate unreadCount]; - BOOL pageFinished = self.appDelegate.feedDetailViewController.pageFinished; + BOOL pageFinished = appDelegate.feedDetailViewController.pageFinished; if ((nextIndex == -1 && unreadCount > 0 && !pageFinished) || nextIndex != -1) { [buttonNext setTitle:[@"Next" uppercaseString] forState:UIControlStateNormal]; @@ -1153,10 +1153,10 @@ - (IBAction)toggleFontSize:(id)sender { - UINavigationController *fontSettingsNavigationController = self.appDelegate.fontSettingsNavigationController; + UINavigationController *fontSettingsNavigationController = appDelegate.fontSettingsNavigationController; [fontSettingsNavigationController popToRootViewControllerAnimated:NO]; - [self.appDelegate showPopoverWithViewController:fontSettingsNavigationController contentSize:CGSizeZero barButtonItem:self.fontSettingsButton]; + [appDelegate showPopoverWithViewController:fontSettingsNavigationController contentSize:CGSizeZero barButtonItem:self.fontSettingsButton]; } - (void)setFontStyle:(NSString *)fontStyle { @@ -1220,10 +1220,10 @@ #pragma mark Story Traversal - (IBAction)doNextUnreadStory:(id)sender { - FeedDetailViewController *fdvc = self.appDelegate.feedDetailViewController; + FeedDetailViewController *fdvc = appDelegate.feedDetailViewController; NSInteger nextLocation = [appDelegate.storiesCollection locationOfNextUnreadStory]; NSInteger unreadCount = [appDelegate unreadCount]; - BOOL pageFinished = self.appDelegate.feedDetailViewController.pageFinished; + BOOL pageFinished = appDelegate.feedDetailViewController.pageFinished; [self.loadingIndicator stopAnimating]; diff --git a/clients/ios/Classes/TrainerViewController.m b/clients/ios/Classes/TrainerViewController.m index a4ca0977d..15661b3b5 100644 --- a/clients/ios/Classes/TrainerViewController.m +++ b/clients/ios/Classes/TrainerViewController.m @@ -80,37 +80,29 @@ MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; HUD.labelText = @"Loading trainer..."; NSString *feedId = [self feedId]; - NSURL *url = [NSURL URLWithString:[NSString - stringWithFormat:@"%@/reader/feeds_trainer?feed_id=%@", - self.appDelegate.url, feedId]]; - - __weak __typeof(&*self)weakSelf = self; - AFHTTPRequestOperation *request = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]]; - [request setResponseSerializer:[AFJSONResponseSerializer serializer]]; - [request setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { - __strong __typeof(&*weakSelf)strongSelf = weakSelf; - if (!strongSelf) return; - [MBProgressHUD hideHUDForView:strongSelf.view animated:YES]; - NSDictionary *results = [responseObject objectAtIndex:0]; + NSString *urlString = [NSString stringWithFormat:@"%@/reader/feeds_trainer?feed_id=%@", + self.appDelegate.url, feedId]; + [appDelegate.networkManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + [MBProgressHUD hideHUDForView:self.view animated:YES]; + NSDictionary *results = responseObject; NSMutableDictionary *newClassifiers = [[results objectForKey:@"classifiers"] mutableCopy]; [appDelegate.storiesCollection.activeClassifiers setObject:newClassifiers forKey:feedId]; appDelegate.storiesCollection.activePopularAuthors = [results objectForKey:@"feed_authors"]; appDelegate.storiesCollection.activePopularTags = [results objectForKey:@"feed_tags"]; [self renderTrainer]; - } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"Failed fetch trainer: %@", error); [self informError:@"Could not load trainer"]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^() { - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - [appDelegate hidePopover]; - } else { - [appDelegate.navigationController dismissViewControllerAnimated:YES completion:nil]; - } - }); + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + [appDelegate hidePopover]; + } else { + [appDelegate.navigationController dismissViewControllerAnimated:YES completion:nil]; + } + }); }]; - [request start]; } else { [self renderTrainer]; } diff --git a/clients/ios/Classes/UserProfileViewController.m b/clients/ios/Classes/UserProfileViewController.m index 787e2282e..7b89382a1 100644 --- a/clients/ios/Classes/UserProfileViewController.m +++ b/clients/ios/Classes/UserProfileViewController.m @@ -23,7 +23,6 @@ @synthesize activitiesArray; @synthesize activitiesUsername; @synthesize userProfile; -@synthesize request; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { @@ -37,8 +36,6 @@ - (void)dealloc { self.profileTable.dataSource = nil; self.profileTable.delegate = nil; - request.delegate = nil; - [request cancel]; } - (void)viewDidLoad { diff --git a/clients/ios/Classes/offline/OfflineFetchImages.h b/clients/ios/Classes/offline/OfflineFetchImages.h index 4cde86554..cbbca53ef 100644 --- a/clients/ios/Classes/offline/OfflineFetchImages.h +++ b/clients/ios/Classes/offline/OfflineFetchImages.h @@ -13,7 +13,6 @@ @interface OfflineFetchImages : NSOperation @property (nonatomic) NewsBlurAppDelegate *appDelegate; -@property (readwrite) ASINetworkQueue *imageDownloadOperationQueue; - (BOOL)fetchImages; - (NSArray *)uncachedImageUrls; diff --git a/clients/ios/Classes/offline/OfflineFetchImages.m b/clients/ios/Classes/offline/OfflineFetchImages.m index 7d33c8b7f..5d03a218d 100644 --- a/clients/ios/Classes/offline/OfflineFetchImages.m +++ b/clients/ios/Classes/offline/OfflineFetchImages.m @@ -14,7 +14,6 @@ #import "Utilities.h" @implementation OfflineFetchImages -@synthesize imageDownloadOperationQueue; @synthesize appDelegate; - (void)main { @@ -29,27 +28,18 @@ - (BOOL)fetchImages { if (self.isCancelled) { NSLog(@"Images cancelled."); - [imageDownloadOperationQueue cancelAllOperations]; return NO; } // NSLog(@"Fetching images..."); NSArray *urls = [self uncachedImageUrls]; - if (imageDownloadOperationQueue) { - [imageDownloadOperationQueue cancelAllOperations]; - imageDownloadOperationQueue = nil; - } - imageDownloadOperationQueue = [[ASINetworkQueue alloc] init]; - imageDownloadOperationQueue.maxConcurrentOperationCount = 8; - imageDownloadOperationQueue.delegate = self; - if (![[[NSUserDefaults standardUserDefaults] objectForKey:@"offline_image_download"] boolValue] || ![[[NSUserDefaults standardUserDefaults] objectForKey:@"offline_allowed"] boolValue] || [urls count] == 0) { - NSLog(@"Finished caching images. %d total", appDelegate.totalUncachedImagesCount); + NSLog(@"Finished caching images. %ld total", (long)appDelegate.totalUncachedImagesCount); dispatch_async(dispatch_get_main_queue(), ^{ [appDelegate.feedsViewController showDoneNotifier]; [appDelegate.feedsViewController hideNotifier]; @@ -68,29 +58,31 @@ } - NSMutableArray *downloadRequests = [NSMutableArray array]; + AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; + [manager.requestSerializer setTimeoutInterval:5]; + manager.responseSerializer = [AFImageResponseSerializer serializer]; + dispatch_group_t group = dispatch_group_create(); + for (NSArray *urlArray in urls) { NSString *urlString = [urlArray objectAtIndex:0]; NSString *storyHash = [urlArray objectAtIndex:1]; NSString *storyTimestamp = [urlArray objectAtIndex:2]; - + dispatch_group_enter(group); [appDelegate.networkManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - [self storeCachedImage:responseObject storyHash:storyHash storyTimestamp:storyTimestamp]; + UIImage *image = (UIImage *)responseObject; + [self storeCachedImage:urlString withImage:image storyHash:storyHash storyTimestamp:storyTimestamp]; + dispatch_group_leave(group); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [self storeFailedImage:storyHash]; + dispatch_group_leave(group); }]; - [downloadRequests addObject:request]; } - [imageDownloadOperationQueue setQueueDidFinishSelector:@selector(cachedImageQueueFinished:)]; - [imageDownloadOperationQueue setShouldCancelAllRequestsOnFailure:NO]; - [imageDownloadOperationQueue go]; + dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, + (unsigned long)NULL), ^{ + [self cachedImageQueueFinished]; + }); [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; - [imageDownloadOperationQueue addOperations:downloadRequests waitUntilFinished:YES]; - for (ASIHTTPRequest *request in downloadRequests) { - [request setRawResponseData:nil]; - } - [imageDownloadOperationQueue reset]; // dispatch_async(dispatch_get_main_queue(), ^{ // [appDelegate.feedsViewController hideNotifier]; // }); @@ -153,33 +145,25 @@ }); } -- (void)storeCachedImage:(ASIHTTPRequest *)request { +- (void)storeCachedImage:(NSString *)imageUrl withImage:(UIImage *)image storyHash:(NSString *)storyHash storyTimestamp:(NSInteger)storyTimestamp { if (self.isCancelled) { NSLog(@"Image cancelled."); - [request clearDelegatesAndCancel]; return; } dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, (unsigned long)NULL), ^{ - NSString *storyHash = [[request userInfo] objectForKey:@"story_hash"]; - int storyTimestamp = [[[request userInfo] objectForKey:@"story_timestamp"] intValue]; - - if ([request responseStatusCode] == 200) { - NSData *responseData = [request responseData]; - NSString *md5Url = [Utilities md5:[[request originalURL] absoluteString]]; + NSData *responseData = UIImageJPEGRepresentation(image, 0.6); + NSString *md5Url = [Utilities md5:imageUrl]; // NSLog(@"Storing image: %@ (%d bytes - %d in queue)", storyHash, [responseData length], [imageDownloadOperationQueue requestsCount]); - - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); - NSString *cacheDirectory = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"story_images"]; - NSString *fullPath = [cacheDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", md5Url, [[[request originalURL] absoluteString] pathExtension]]]; - - [fileManager createFileAtPath:fullPath contents:responseData attributes:nil]; - } else { - NSLog(@"Failed to fetch: %@ / %@", [[request originalURL] absoluteString], storyHash); - } + + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); + NSString *cacheDirectory = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"story_images"]; + NSString *fullPath = [cacheDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", md5Url, [imageUrl pathExtension]]]; + + [fileManager createFileAtPath:fullPath contents:responseData attributes:nil]; [appDelegate.database inDatabase:^(FMDatabase *db) { [db executeUpdate:@"UPDATE cached_images SET " @@ -212,7 +196,7 @@ }]; } -- (void)cachedImageQueueFinished:(ASINetworkQueue *)queue { +- (void)cachedImageQueueFinished { NSLog(@"Queue finished: %d total (%d remaining)", appDelegate.totalUncachedImagesCount, appDelegate.remainingUncachedImagesCount); [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; [self fetchImages]; diff --git a/clients/ios/Classes/offline/OfflineFetchStories.h b/clients/ios/Classes/offline/OfflineFetchStories.h index a55d2d04f..c96bb47bc 100644 --- a/clients/ios/Classes/offline/OfflineFetchStories.h +++ b/clients/ios/Classes/offline/OfflineFetchStories.h @@ -7,11 +7,10 @@ // #import -#import "AFHTTPRequestOperation.h" #import "NewsBlurAppDelegate.h" @interface OfflineFetchStories : NSOperation { - AFHTTPRequestOperation *request; + } @property (nonatomic) NewsBlurAppDelegate *appDelegate; diff --git a/clients/ios/Classes/offline/OfflineFetchStories.m b/clients/ios/Classes/offline/OfflineFetchStories.m index 619923a28..4cf3d39b6 100644 --- a/clients/ios/Classes/offline/OfflineFetchStories.m +++ b/clients/ios/Classes/offline/OfflineFetchStories.m @@ -11,7 +11,6 @@ #import "NewsBlurViewController.h" #import "FMDatabase.h" #import "FMDatabaseAdditions.h" -#import "AFHTTPRequestOperation.h" #import "SBJson4.h" #import "NSObject+SBJSON.h" @@ -66,31 +65,22 @@ } __block NSCondition *lock = [NSCondition new]; - __weak __typeof(&*self)weakSelf = self; [lock lock]; - NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/reader/river_stories?include_hidden=true&page=0&h=%@", - self.appDelegate.url, [hashes componentsJoinedByString:@"&h="]]]; - if (request) request = nil; - - request = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]]; - [request setResponseSerializer:[AFJSONResponseSerializer serializer]]; - [request setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { - __strong __typeof(&*weakSelf)strongSelf = weakSelf; - if (!strongSelf) return; - [strongSelf storeAllUnreadStories:responseObject withHashes:hashes]; + NSString *urlString = [NSString stringWithFormat:@"%@/reader/river_stories?include_hidden=true&page=0&h=%@", + self.appDelegate.url, [hashes componentsJoinedByString:@"&h="]]; + AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; + manager.responseSerializer = [AFJSONResponseSerializer serializer]; + + [manager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + [self storeAllUnreadStories:responseObject withHashes:hashes]; [lock signal]; - } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"Failed fetch all unreads: %@", error); [lock signal]; }]; - [request setCompletionQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, (unsigned long)NULL)]; - - [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; - [request start]; - [request waitUntilFinished]; - [request.outputStream close]; + [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; [lock waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:30]]; [lock unlock]; diff --git a/clients/ios/Classes/offline/OfflineSyncUnreads.h b/clients/ios/Classes/offline/OfflineSyncUnreads.h index 5a9a6d5cf..36cefc044 100644 --- a/clients/ios/Classes/offline/OfflineSyncUnreads.h +++ b/clients/ios/Classes/offline/OfflineSyncUnreads.h @@ -9,12 +9,10 @@ #import #import "NewsBlurAppDelegate.h" #import "FMDatabaseQueue.h" -#import "AFHTTPRequestOperation.h" @interface OfflineSyncUnreads : NSOperation @property (nonatomic) NewsBlurAppDelegate *appDelegate; -@property (nonatomic) AFHTTPRequestOperation *request; - (void)storeUnreadHashes:(NSDictionary *)results; diff --git a/clients/ios/Classes/offline/OfflineSyncUnreads.m b/clients/ios/Classes/offline/OfflineSyncUnreads.m index e9a40808f..8980a636e 100644 --- a/clients/ios/Classes/offline/OfflineSyncUnreads.m +++ b/clients/ios/Classes/offline/OfflineSyncUnreads.m @@ -11,12 +11,10 @@ #import "NewsBlurViewController.h" #import "FMResultSet.h" #import "FMDatabase.h" -#import "AFHTTPRequestOperation.h" @implementation OfflineSyncUnreads @synthesize appDelegate; -@synthesize request; - (void)main { appDelegate = [NewsBlurAppDelegate sharedAppDelegate]; @@ -27,27 +25,21 @@ }); __block NSCondition *lock = [NSCondition new]; - __weak __typeof(&*self)weakSelf = self; [lock lock]; - NSURL *url = [NSURL URLWithString:[NSString - stringWithFormat:@"%@/reader/unread_story_hashes?include_timestamps=true", - self.appDelegate.url]]; - request = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]]; - [request setResponseSerializer:[AFJSONResponseSerializer serializer]]; - [request setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { - __strong __typeof(&*weakSelf)strongSelf = weakSelf; - NSLog(@"Syncing stories success: %@-%@", weakSelf, strongSelf); - if (!strongSelf) return; - [strongSelf storeUnreadHashes:responseObject]; + NSString *urlString = [NSString stringWithFormat:@"%@/reader/unread_story_hashes?include_timestamps=true", + self.appDelegate.url]; + AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; + manager.responseSerializer = [AFJSONResponseSerializer serializer]; + [manager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + NSLog(@"Syncing stories success"); + [self storeUnreadHashes:responseObject]; [lock signal]; - } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"Failed fetch all story hashes: %@", error); [lock signal]; }]; - [request setCompletionQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL)]; - [request start]; - + [lock waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:30]]; [lock unlock]; @@ -57,7 +49,7 @@ - (void)storeUnreadHashes:(NSDictionary *)results { if (self.isCancelled) { // NSLog(@"Canceled storing unread hashes"); - [request cancel]; +// [request cancel]; return; } diff --git a/clients/ios/NewsBlur.xcodeproj/project.pbxproj b/clients/ios/NewsBlur.xcodeproj/project.pbxproj index cd1d55f4a..6c7b93b14 100755 --- a/clients/ios/NewsBlur.xcodeproj/project.pbxproj +++ b/clients/ios/NewsBlur.xcodeproj/project.pbxproj @@ -276,6 +276,21 @@ FF22FE7716E557D80046165A /* toolbar_tall_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FF22FE7516E557D80046165A /* toolbar_tall_background@2x.png */; }; FF26125418C00FEC0055FF4D /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF26125318C00FEC0055FF4D /* AddressBook.framework */; }; FF265F12187B6D4F0080C332 /* fitvid.js in Resources */ = {isa = PBXBuildFile; fileRef = FF265F10187B6B230080C332 /* fitvid.js */; }; + FF2924BF1E92DF7C00FCFA63 /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = FF29249F1E92DF7C00FCFA63 /* AFAutoPurgingImageCache.m */; }; + FF2924C01E92DF7C00FCFA63 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924A11E92DF7C00FCFA63 /* AFHTTPSessionManager.m */; }; + FF2924C11E92DF7C00FCFA63 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924A31E92DF7C00FCFA63 /* AFImageDownloader.m */; }; + FF2924C21E92DF7C00FCFA63 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924A51E92DF7C00FCFA63 /* AFNetworkActivityIndicatorManager.m */; }; + FF2924C31E92DF7C00FCFA63 /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924A81E92DF7C00FCFA63 /* AFNetworkReachabilityManager.m */; }; + FF2924C41E92DF7C00FCFA63 /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924AA1E92DF7C00FCFA63 /* AFSecurityPolicy.m */; }; + FF2924C51E92DF7C00FCFA63 /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924AC1E92DF7C00FCFA63 /* AFURLRequestSerialization.m */; }; + FF2924C61E92DF7C00FCFA63 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924AE1E92DF7C00FCFA63 /* AFURLResponseSerialization.m */; }; + FF2924C71E92DF7C00FCFA63 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924B01E92DF7C00FCFA63 /* AFURLSessionManager.m */; }; + FF2924C81E92DF7C00FCFA63 /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924B21E92DF7C00FCFA63 /* UIActivityIndicatorView+AFNetworking.m */; }; + FF2924C91E92DF7C00FCFA63 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924B41E92DF7C00FCFA63 /* UIButton+AFNetworking.m */; }; + FF2924CA1E92DF7C00FCFA63 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924B71E92DF7C00FCFA63 /* UIImageView+AFNetworking.m */; }; + FF2924CB1E92DF7C00FCFA63 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924BA1E92DF7C00FCFA63 /* UIProgressView+AFNetworking.m */; }; + FF2924CC1E92DF7C00FCFA63 /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924BC1E92DF7C00FCFA63 /* UIRefreshControl+AFNetworking.m */; }; + FF2924CD1E92DF7C00FCFA63 /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FF2924BE1E92DF7C00FCFA63 /* UIWebView+AFNetworking.m */; }; FF29708B16DD7AA400E92F85 /* segment_active.png in Resources */ = {isa = PBXBuildFile; fileRef = FF29708916DD7AA400E92F85 /* segment_active.png */; }; FF29708C16DD7AA400E92F85 /* segment_inactive.png in Resources */ = {isa = PBXBuildFile; fileRef = FF29708A16DD7AA400E92F85 /* segment_inactive.png */; }; FF29708E16DD7C8A00E92F85 /* segment_left_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = FF29708D16DD7C8A00E92F85 /* segment_left_selected.png */; }; @@ -479,16 +494,6 @@ FFCDD90117F65A71000C6483 /* NBSwipeableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FFCDD90017F65A71000C6483 /* NBSwipeableCell.m */; }; FFD1D7311459B63500E46F89 /* BaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD1D7301459B63500E46F89 /* BaseViewController.m */; }; FFD6604C1BACA45D006E4B8D /* THCircularProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD6604B1BACA45D006E4B8D /* THCircularProgressView.m */; }; - FFD660611BACA46D006E4B8D /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD6604F1BACA46D006E4B8D /* AFHTTPRequestOperation.m */; }; - FFD660621BACA46D006E4B8D /* AFHTTPRequestOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD660511BACA46D006E4B8D /* AFHTTPRequestOperationManager.m */; }; - FFD660631BACA46D006E4B8D /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD660531BACA46D006E4B8D /* AFHTTPSessionManager.m */; }; - FFD660641BACA46D006E4B8D /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD660561BACA46D006E4B8D /* AFNetworkReachabilityManager.m */; }; - FFD660651BACA46D006E4B8D /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD660581BACA46D006E4B8D /* AFSecurityPolicy.m */; }; - FFD660661BACA46D006E4B8D /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD6605A1BACA46D006E4B8D /* AFURLConnectionOperation.m */; }; - FFD660671BACA46D006E4B8D /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD6605C1BACA46D006E4B8D /* AFURLRequestSerialization.m */; }; - FFD660681BACA46D006E4B8D /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD6605E1BACA46D006E4B8D /* AFURLResponseSerialization.m */; }; - FFD660691BACA46D006E4B8D /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD660601BACA46D006E4B8D /* AFURLSessionManager.m */; }; - FFD6606C1BACA49C006E4B8D /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD6606B1BACA49C006E4B8D /* UIImageView+AFNetworking.m */; }; FFD887F01445F1E800385399 /* AddSiteAutocompleteCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD887EE1445F1E800385399 /* AddSiteAutocompleteCell.m */; }; FFDCA0BB16E80877000D8E0C /* GCOAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = FFDCA0B716E80877000D8E0C /* GCOAuth.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; FFDCA0BC16E80877000D8E0C /* NSData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = FFDCA0B916E80877000D8E0C /* NSData+Base64.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; @@ -911,6 +916,39 @@ FF22FE7516E557D80046165A /* toolbar_tall_background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "toolbar_tall_background@2x.png"; sourceTree = ""; }; FF26125318C00FEC0055FF4D /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; FF265F10187B6B230080C332 /* fitvid.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = fitvid.js; path = static/fitvid.js; sourceTree = SOURCE_ROOT; }; + FF29249E1E92DF7C00FCFA63 /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFAutoPurgingImageCache.h; sourceTree = ""; }; + FF29249F1E92DF7C00FCFA63 /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFAutoPurgingImageCache.m; sourceTree = ""; }; + FF2924A01E92DF7C00FCFA63 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPSessionManager.h; sourceTree = ""; }; + FF2924A11E92DF7C00FCFA63 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPSessionManager.m; sourceTree = ""; }; + FF2924A21E92DF7C00FCFA63 /* AFImageDownloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFImageDownloader.h; sourceTree = ""; }; + FF2924A31E92DF7C00FCFA63 /* AFImageDownloader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFImageDownloader.m; sourceTree = ""; }; + FF2924A41E92DF7C00FCFA63 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworkActivityIndicatorManager.h; sourceTree = ""; }; + FF2924A51E92DF7C00FCFA63 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFNetworkActivityIndicatorManager.m; sourceTree = ""; }; + FF2924A61E92DF7C00FCFA63 /* AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworking.h; sourceTree = ""; }; + FF2924A71E92DF7C00FCFA63 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworkReachabilityManager.h; sourceTree = ""; }; + FF2924A81E92DF7C00FCFA63 /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFNetworkReachabilityManager.m; sourceTree = ""; }; + FF2924A91E92DF7C00FCFA63 /* AFSecurityPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFSecurityPolicy.h; sourceTree = ""; }; + FF2924AA1E92DF7C00FCFA63 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFSecurityPolicy.m; sourceTree = ""; }; + FF2924AB1E92DF7C00FCFA63 /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLRequestSerialization.h; sourceTree = ""; }; + FF2924AC1E92DF7C00FCFA63 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLRequestSerialization.m; sourceTree = ""; }; + FF2924AD1E92DF7C00FCFA63 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLResponseSerialization.h; sourceTree = ""; }; + FF2924AE1E92DF7C00FCFA63 /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLResponseSerialization.m; sourceTree = ""; }; + FF2924AF1E92DF7C00FCFA63 /* AFURLSessionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLSessionManager.h; sourceTree = ""; }; + FF2924B01E92DF7C00FCFA63 /* AFURLSessionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLSessionManager.m; sourceTree = ""; }; + FF2924B11E92DF7C00FCFA63 /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; + FF2924B21E92DF7C00FCFA63 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; + FF2924B31E92DF7C00FCFA63 /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+AFNetworking.h"; sourceTree = ""; }; + FF2924B41E92DF7C00FCFA63 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+AFNetworking.m"; sourceTree = ""; }; + FF2924B51E92DF7C00FCFA63 /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+AFNetworking.h"; sourceTree = ""; }; + FF2924B61E92DF7C00FCFA63 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworking.h"; sourceTree = ""; }; + FF2924B71E92DF7C00FCFA63 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+AFNetworking.m"; sourceTree = ""; }; + FF2924B81E92DF7C00FCFA63 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIKit+AFNetworking.h"; sourceTree = ""; }; + FF2924B91E92DF7C00FCFA63 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIProgressView+AFNetworking.h"; sourceTree = ""; }; + FF2924BA1E92DF7C00FCFA63 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIProgressView+AFNetworking.m"; sourceTree = ""; }; + FF2924BB1E92DF7C00FCFA63 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; + FF2924BC1E92DF7C00FCFA63 /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; + FF2924BD1E92DF7C00FCFA63 /* UIWebView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWebView+AFNetworking.h"; sourceTree = ""; }; + FF2924BE1E92DF7C00FCFA63 /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWebView+AFNetworking.m"; sourceTree = ""; }; FF29708916DD7AA400E92F85 /* segment_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = segment_active.png; sourceTree = ""; }; FF29708A16DD7AA400E92F85 /* segment_inactive.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = segment_inactive.png; sourceTree = ""; }; FF29708D16DD7C8A00E92F85 /* segment_left_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = segment_left_selected.png; sourceTree = ""; }; @@ -1207,27 +1245,6 @@ FFD1D7301459B63500E46F89 /* BaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseViewController.m; sourceTree = ""; }; FFD6604A1BACA45D006E4B8D /* THCircularProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = THCircularProgressView.h; path = "Other Sources/THCircularProgressView.h"; sourceTree = ""; }; FFD6604B1BACA45D006E4B8D /* THCircularProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = THCircularProgressView.m; path = "Other Sources/THCircularProgressView.m"; sourceTree = ""; }; - FFD6604E1BACA46D006E4B8D /* AFHTTPRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPRequestOperation.h; sourceTree = ""; }; - FFD6604F1BACA46D006E4B8D /* AFHTTPRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPRequestOperation.m; sourceTree = ""; }; - FFD660501BACA46D006E4B8D /* AFHTTPRequestOperationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPRequestOperationManager.h; sourceTree = ""; }; - FFD660511BACA46D006E4B8D /* AFHTTPRequestOperationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPRequestOperationManager.m; sourceTree = ""; }; - FFD660521BACA46D006E4B8D /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPSessionManager.h; sourceTree = ""; }; - FFD660531BACA46D006E4B8D /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPSessionManager.m; sourceTree = ""; }; - FFD660541BACA46D006E4B8D /* AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworking.h; sourceTree = ""; }; - FFD660551BACA46D006E4B8D /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworkReachabilityManager.h; sourceTree = ""; }; - FFD660561BACA46D006E4B8D /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFNetworkReachabilityManager.m; sourceTree = ""; }; - FFD660571BACA46D006E4B8D /* AFSecurityPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFSecurityPolicy.h; sourceTree = ""; }; - FFD660581BACA46D006E4B8D /* AFSecurityPolicy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFSecurityPolicy.m; sourceTree = ""; }; - FFD660591BACA46D006E4B8D /* AFURLConnectionOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLConnectionOperation.h; sourceTree = ""; }; - FFD6605A1BACA46D006E4B8D /* AFURLConnectionOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLConnectionOperation.m; sourceTree = ""; }; - FFD6605B1BACA46D006E4B8D /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLRequestSerialization.h; sourceTree = ""; }; - FFD6605C1BACA46D006E4B8D /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLRequestSerialization.m; sourceTree = ""; }; - FFD6605D1BACA46D006E4B8D /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLResponseSerialization.h; sourceTree = ""; }; - FFD6605E1BACA46D006E4B8D /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLResponseSerialization.m; sourceTree = ""; }; - FFD6605F1BACA46D006E4B8D /* AFURLSessionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLSessionManager.h; sourceTree = ""; }; - FFD660601BACA46D006E4B8D /* AFURLSessionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLSessionManager.m; sourceTree = ""; }; - FFD6606A1BACA49C006E4B8D /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworking.h"; sourceTree = ""; }; - FFD6606B1BACA49C006E4B8D /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+AFNetworking.m"; sourceTree = ""; }; FFD887ED1445F1E800385399 /* AddSiteAutocompleteCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddSiteAutocompleteCell.h; sourceTree = ""; }; FFD887EE1445F1E800385399 /* AddSiteAutocompleteCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddSiteAutocompleteCell.m; sourceTree = ""; }; FFDCA0B616E80877000D8E0C /* GCOAuth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCOAuth.h; sourceTree = ""; }; @@ -2383,27 +2400,39 @@ FFD6604D1BACA46D006E4B8D /* AFNetworking */ = { isa = PBXGroup; children = ( - FFD6606A1BACA49C006E4B8D /* UIImageView+AFNetworking.h */, - FFD6606B1BACA49C006E4B8D /* UIImageView+AFNetworking.m */, - FFD6604E1BACA46D006E4B8D /* AFHTTPRequestOperation.h */, - FFD6604F1BACA46D006E4B8D /* AFHTTPRequestOperation.m */, - FFD660501BACA46D006E4B8D /* AFHTTPRequestOperationManager.h */, - FFD660511BACA46D006E4B8D /* AFHTTPRequestOperationManager.m */, - FFD660521BACA46D006E4B8D /* AFHTTPSessionManager.h */, - FFD660531BACA46D006E4B8D /* AFHTTPSessionManager.m */, - FFD660541BACA46D006E4B8D /* AFNetworking.h */, - FFD660551BACA46D006E4B8D /* AFNetworkReachabilityManager.h */, - FFD660561BACA46D006E4B8D /* AFNetworkReachabilityManager.m */, - FFD660571BACA46D006E4B8D /* AFSecurityPolicy.h */, - FFD660581BACA46D006E4B8D /* AFSecurityPolicy.m */, - FFD660591BACA46D006E4B8D /* AFURLConnectionOperation.h */, - FFD6605A1BACA46D006E4B8D /* AFURLConnectionOperation.m */, - FFD6605B1BACA46D006E4B8D /* AFURLRequestSerialization.h */, - FFD6605C1BACA46D006E4B8D /* AFURLRequestSerialization.m */, - FFD6605D1BACA46D006E4B8D /* AFURLResponseSerialization.h */, - FFD6605E1BACA46D006E4B8D /* AFURLResponseSerialization.m */, - FFD6605F1BACA46D006E4B8D /* AFURLSessionManager.h */, - FFD660601BACA46D006E4B8D /* AFURLSessionManager.m */, + FF29249E1E92DF7C00FCFA63 /* AFAutoPurgingImageCache.h */, + FF29249F1E92DF7C00FCFA63 /* AFAutoPurgingImageCache.m */, + FF2924A01E92DF7C00FCFA63 /* AFHTTPSessionManager.h */, + FF2924A11E92DF7C00FCFA63 /* AFHTTPSessionManager.m */, + FF2924A21E92DF7C00FCFA63 /* AFImageDownloader.h */, + FF2924A31E92DF7C00FCFA63 /* AFImageDownloader.m */, + FF2924A41E92DF7C00FCFA63 /* AFNetworkActivityIndicatorManager.h */, + FF2924A51E92DF7C00FCFA63 /* AFNetworkActivityIndicatorManager.m */, + FF2924A61E92DF7C00FCFA63 /* AFNetworking.h */, + FF2924A71E92DF7C00FCFA63 /* AFNetworkReachabilityManager.h */, + FF2924A81E92DF7C00FCFA63 /* AFNetworkReachabilityManager.m */, + FF2924A91E92DF7C00FCFA63 /* AFSecurityPolicy.h */, + FF2924AA1E92DF7C00FCFA63 /* AFSecurityPolicy.m */, + FF2924AB1E92DF7C00FCFA63 /* AFURLRequestSerialization.h */, + FF2924AC1E92DF7C00FCFA63 /* AFURLRequestSerialization.m */, + FF2924AD1E92DF7C00FCFA63 /* AFURLResponseSerialization.h */, + FF2924AE1E92DF7C00FCFA63 /* AFURLResponseSerialization.m */, + FF2924AF1E92DF7C00FCFA63 /* AFURLSessionManager.h */, + FF2924B01E92DF7C00FCFA63 /* AFURLSessionManager.m */, + FF2924B11E92DF7C00FCFA63 /* UIActivityIndicatorView+AFNetworking.h */, + FF2924B21E92DF7C00FCFA63 /* UIActivityIndicatorView+AFNetworking.m */, + FF2924B31E92DF7C00FCFA63 /* UIButton+AFNetworking.h */, + FF2924B41E92DF7C00FCFA63 /* UIButton+AFNetworking.m */, + FF2924B51E92DF7C00FCFA63 /* UIImage+AFNetworking.h */, + FF2924B61E92DF7C00FCFA63 /* UIImageView+AFNetworking.h */, + FF2924B71E92DF7C00FCFA63 /* UIImageView+AFNetworking.m */, + FF2924B81E92DF7C00FCFA63 /* UIKit+AFNetworking.h */, + FF2924B91E92DF7C00FCFA63 /* UIProgressView+AFNetworking.h */, + FF2924BA1E92DF7C00FCFA63 /* UIProgressView+AFNetworking.m */, + FF2924BB1E92DF7C00FCFA63 /* UIRefreshControl+AFNetworking.h */, + FF2924BC1E92DF7C00FCFA63 /* UIRefreshControl+AFNetworking.m */, + FF2924BD1E92DF7C00FCFA63 /* UIWebView+AFNetworking.h */, + FF2924BE1E92DF7C00FCFA63 /* UIWebView+AFNetworking.m */, ); name = AFNetworking; path = "Other Sources/AFNetworking"; @@ -2934,15 +2963,11 @@ 787A0CDB11CE65330056422D /* FeedDetailViewController.m in Sources */, FF2EB7B51AA65504002549A7 /* IASKSettingsStore.m in Sources */, 7842ECF811D44A530066CF9D /* StoryDetailViewController.m in Sources */, - FFD6606C1BACA49C006E4B8D /* UIImageView+AFNetworking.m in Sources */, 7843F50511EEB1A000675F64 /* FeedDetailTableCell.m in Sources */, 784B50ED127E3F68008F90EA /* LoginViewController.m in Sources */, FF5ACC241DE5F0C000FBD044 /* NotificationsViewController.m in Sources */, FF2EB7B41AA65504002549A7 /* IASKSettingsReader.m in Sources */, - FFD660691BACA46D006E4B8D /* AFURLSessionManager.m in Sources */, FFCDD8FE17F6368F000C6483 /* MCSwipeTableViewCell.m in Sources */, - FFD660681BACA46D006E4B8D /* AFURLResponseSerialization.m in Sources */, - FFD660611BACA46D006E4B8D /* AFHTTPRequestOperation.m in Sources */, 78095EC9128F30B500230C8E /* OriginalStoryViewController.m in Sources */, FF1C4E171A3FB1F4000995E3 /* NBActivityItemSource.m in Sources */, 17C4954B1C129863004805A7 /* UISearchBar+Field.m in Sources */, @@ -2956,6 +2981,7 @@ FF9B8BB217F2351A0036A41C /* NBBarButtonItem.m in Sources */, FF2D8CE514893BC000057B80 /* MoveSiteViewController.m in Sources */, 433323CD158968ED0025064D /* FirstTimeUserViewController.m in Sources */, + FF2924C41E92DF7C00FCFA63 /* AFSecurityPolicy.m in Sources */, FF8D1ED01BAA311000725D8A /* SBJson4StreamWriter.m in Sources */, 43763AD1158F90B100B3DBE2 /* FontSettingsViewController.m in Sources */, 439DAB201590DA350019B0EB /* FeedsMenuViewController.m in Sources */, @@ -2963,15 +2989,15 @@ FFA045B519CA49D700618DC4 /* SSWAnimator.m in Sources */, 437AA8CA159394E2005463F5 /* ShareViewController.m in Sources */, FF8D1ECC1BAA311000725D8A /* SBJson4Parser.m in Sources */, - FFD660661BACA46D006E4B8D /* AFURLConnectionOperation.m in Sources */, FF2EB7B01AA65504002549A7 /* IASKAppSettingsViewController.m in Sources */, 431B856815A0C45200DCE497 /* FriendsListViewController.m in Sources */, - FFD660621BACA46D006E4B8D /* AFHTTPRequestOperationManager.m in Sources */, 431B856E15A0D91E00DCE497 /* UserProfileViewController.m in Sources */, FF8D1EDB1BAA3CCD00725D8A /* JNWThrottledBlock.m in Sources */, FF2EB7B31AA65504002549A7 /* IASKSpecifierValuesViewController.m in Sources */, 431B858115A23C6B00DCE497 /* ProfileBadge.m in Sources */, 437F974C15ACA0ED0007136B /* DashboardViewController.m in Sources */, + FF2924C71E92DF7C00FCFA63 /* AFURLSessionManager.m in Sources */, + FF2924CD1E92DF7C00FCFA63 /* UIWebView+AFNetworking.m in Sources */, 437F976F15AE21290007136B /* ActivityModule.m in Sources */, 437F977215AE70E30007136B /* InteractionsModule.m in Sources */, 43A4C3D715B00966008787B5 /* ABTableViewCell.m in Sources */, @@ -2979,17 +3005,21 @@ 43A4C3DA15B00966008787B5 /* GTMNString+HTML.m in Sources */, 43A4C3DC15B00966008787B5 /* main.m in Sources */, 43A4C3DD15B00966008787B5 /* MBProgressHUD.m in Sources */, + FF2924CA1E92DF7C00FCFA63 /* UIImageView+AFNetworking.m in Sources */, 43A4C3E115B00966008787B5 /* NSString+HTML.m in Sources */, FF6282151A11613900271FDB /* UserTagsViewController.m in Sources */, FF2EB7BD1AA65504002549A7 /* IASKSwitch.m in Sources */, 43A4C3E315B00966008787B5 /* StringHelper.m in Sources */, FF1F13D518A9C2BE00FDA816 /* TMMemoryCache.m in Sources */, + FF2924C91E92DF7C00FCFA63 /* UIButton+AFNetworking.m in Sources */, 43A4C3E415B00966008787B5 /* TransparentToolbar.m in Sources */, - FFD660651BACA46D006E4B8D /* AFSecurityPolicy.m in Sources */, FFD6604C1BACA45D006E4B8D /* THCircularProgressView.m in Sources */, + FF2924C61E92DF7C00FCFA63 /* AFURLResponseSerialization.m in Sources */, FFA0484419CA73B700618DC4 /* UIView+ViewController.m in Sources */, 17432C891C534BC6003F8FD6 /* FeedChooserViewCell.m in Sources */, 43A4C3E515B00966008787B5 /* UIView+TKCategory.m in Sources */, + FF2924C11E92DF7C00FCFA63 /* AFImageDownloader.m in Sources */, + FF2924C31E92DF7C00FCFA63 /* AFNetworkReachabilityManager.m in Sources */, 43F6A79D15B0CDC60092EE91 /* ActivityCell.m in Sources */, FF3FA88D1BB2677C001F7C32 /* NBCopyLinkActivity.m in Sources */, 17432C831C53438D003F8FD6 /* FeedChooserViewController.m in Sources */, @@ -2998,13 +3028,11 @@ 43ABBCAA15B53A1400EA3111 /* InteractionCell.m in Sources */, FF2EB7BE1AA65504002549A7 /* IASKTextField.m in Sources */, FF8D1ECF1BAA311000725D8A /* SBJson4StreamTokeniser.m in Sources */, - FFD660641BACA46D006E4B8D /* AFNetworkReachabilityManager.m in Sources */, FF5ACC2E1DE63C6D00FBD044 /* MultiSelectSegmentedControl.m in Sources */, FF8D1ED81BAA33BA00725D8A /* NSObject+SBJSON.m in Sources */, FF2EB7B11AA65504002549A7 /* IASKAppSettingsWebViewController.m in Sources */, FF1F13D418A9C2BE00FDA816 /* TMDiskCache.m in Sources */, FF2EB7BB1AA65504002549A7 /* IASKPSTextFieldSpecifierViewCell.m in Sources */, - FFD660631BACA46D006E4B8D /* AFHTTPSessionManager.m in Sources */, 43D818A315B940C200733444 /* DataUtilities.m in Sources */, FF03AFFD19F881380063002A /* ARChromeActivity.m in Sources */, 4383DCD615BB8B88007E6611 /* SmallActivityCell.m in Sources */, @@ -3018,6 +3046,8 @@ 438FEDE815D5B15F00E3B3C9 /* FollowGrid.m in Sources */, FF8D1ED21BAA311000725D8A /* SBJson4Writer.m in Sources */, 43B232C015D5F61700D035B4 /* AuthorizeServicesViewController.m in Sources */, + FF2924BF1E92DF7C00FCFA63 /* AFAutoPurgingImageCache.m in Sources */, + FF2924C21E92DF7C00FCFA63 /* AFNetworkActivityIndicatorManager.m in Sources */, FF2EB7B71AA65504002549A7 /* IASKSettingsStoreUserDefaults.m in Sources */, FF2EB7BA1AA65504002549A7 /* IASKPSSliderSpecifierViewCell.m in Sources */, 43CE0F5F15DADB7F00608ED8 /* SiteCell.m in Sources */, @@ -3026,6 +3056,7 @@ FFDE35CC161B8F870034BFDE /* FolderTitleView.m in Sources */, FFDE35DA161D12250034BFDE /* UnreadCountView.m in Sources */, FFDE35EA162799B90034BFDE /* FeedDetailMenuViewController.m in Sources */, + FF2924C01E92DF7C00FCFA63 /* AFHTTPSessionManager.m in Sources */, FF4130A3162E10CF00DDB6A7 /* MenuTableViewCell.m in Sources */, 17432C7F1C533FBC003F8FD6 /* MenuViewController.m in Sources */, 17E635AF1C548C580075338E /* FeedChooserItem.m in Sources */, @@ -3033,10 +3064,12 @@ FF67D3B2168924C40057A7DA /* TrainerViewController.m in Sources */, FF1660CD16D6FD8A00AF8541 /* SmallInteractionCell.m in Sources */, FF8D1ECE1BAA311000725D8A /* SBJson4StreamParserState.m in Sources */, + FF2924CB1E92DF7C00FCFA63 /* UIProgressView+AFNetworking.m in Sources */, FF4151C016DED9660013E84B /* UIBarButtonItem+Image.m in Sources */, FF8D1ED11BAA311000725D8A /* SBJson4StreamWriterState.m in Sources */, FF5ACC271DE5FA3E00FBD044 /* NotificationFeedCell.m in Sources */, FFA045B619CA49D700618DC4 /* SSWDirectionalPanGestureRecognizer.m in Sources */, + FF2924CC1E92DF7C00FCFA63 /* UIRefreshControl+AFNetworking.m in Sources */, FF1F13D318A9C2BE00FDA816 /* TMCache.m in Sources */, FF22FE5E16E53ADC0046165A /* Underscore+Functional.m in Sources */, 17C074961C14C46B00CFCDB7 /* ThemeManager.m in Sources */, @@ -3049,8 +3082,8 @@ FF753CCF175858FC00344EC9 /* FMDatabaseAdditions.m in Sources */, FF753CD0175858FC00344EC9 /* FMDatabasePool.m in Sources */, FF753CD1175858FC00344EC9 /* FMDatabaseQueue.m in Sources */, + FF2924C81E92DF7C00FCFA63 /* UIActivityIndicatorView+AFNetworking.m in Sources */, FF753CD3175858FC00344EC9 /* FMResultSet.m in Sources */, - FFD660671BACA46D006E4B8D /* AFURLRequestSerialization.m in Sources */, FF6618C8176184560039913B /* NBNotifier.m in Sources */, FF03AFF319F87F2E0063002A /* TUSafariActivity.m in Sources */, FF03B00A19F987E00063002A /* NJKWebViewProgressView.m in Sources */, @@ -3061,6 +3094,7 @@ FF855B5B1794B0670098D48A /* OfflineSyncUnreads.m in Sources */, FF855B5E1794B0760098D48A /* OfflineFetchStories.m in Sources */, FF855B611794B0830098D48A /* OfflineFetchImages.m in Sources */, + FF2924C51E92DF7C00FCFA63 /* AFURLRequestSerialization.m in Sources */, FF8D1EA71BAA304E00725D8A /* Reachability.m in Sources */, FFCDD90117F65A71000C6483 /* NBSwipeableCell.m in Sources */, );