I need to preload and cache all (almost 80) images at the beginning of the application, showing the user "Wait." I have done this:
NSMutableArray *operations = [[NSMutableArray alloc] init]; for(Category *c in shop.menu.categories){ NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:c.imagePath] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30]; AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:nil cacheName:@"nscache" success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ }]; [operations addObject:operation]; for(Item *i in c.items){ NSURLRequest *request2 = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:i.imagePath] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30]; AFImageRequestOperation *operation2 = [AFImageRequestOperation imageRequestOperationWithRequest:request2 imageProcessingBlock:nil cacheName:@"nscache" success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ }]; [operations addObject:operation2]; } } [[APIClient sharedClient] enqueueBatchOfHTTPRequestOperations:operations progressBlock:^(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations) { float percentDone = 100 * ((float)((int)numberOfCompletedOperations) / (float)((int)totalNumberOfOperations)); //appDelegateHUD.progress = percentDone; NSLog([NSString stringWithFormat:@"%f", percentDone]); } completionBlock:^(NSArray *operations) { AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; [appDelegate hideHUDWithDelay:0]; }];
Using this code block, some of the images are successfully cached, while others are not. I use this block of code:
AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:imageRequest imageProcessingBlock:nil cacheName:@"nscache" success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image){ [UIView beginAnimations:@"ToggleViews" context:nil]; [UIView setAnimationDuration:1.0]; imageview.image = image; [UIView commitAnimations]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ NSLog([error description]); } ]; [operation start];
Images must be displayed directly because they must all be in the cache. But they load a little late. Am I mistaken in some piece of code?
ios caching afnetworking
Burak
source share