Skip to content

Instantly share code, notes, and snippets.

@namanhams
Last active August 29, 2015 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save namanhams/8ebac67b351edf06d50b to your computer and use it in GitHub Desktop.
Save namanhams/8ebac67b351edf06d50b to your computer and use it in GitHub Desktop.
PFQuery+IsCache
typedef void (^fg_PFArrayResultBlock)(NSArray *PF_NULLABLE_S objects, NSError *PF_NULLABLE_S error, BOOL isCache, BOOL done);
@interface PFQuery (IsCache)
- (void)fg_findObjectsInBackgroundWithBlock:(PF_NULLABLE fg_PFArrayResultBlock)block
willLoadFromCache:(void (^ __nullable)())willLoadFromCache
willLoadFromNetwork:(void (^ __nullable)())willLoadFromNetwork;
@end
@implementation PFQuery (IsCache)
- (void)fg_findObjectsInBackgroundWithBlock:(PF_NULLABLE fg_PFArrayResultBlock)block
willLoadFromCache:(void (^)())willLoadFromCache
willLoadFromNetwork:(void (^)())willLoadFromNetwork
{
PFCachePolicy cachePolicy = self.cachePolicy;
if(cachePolicy == kPFCachePolicyCacheOnly || cachePolicy == kPFCachePolicyNetworkOnly || cachePolicy == kPFCachePolicyIgnoreCache)
{
if(cachePolicy == kPFCachePolicyCacheOnly){
if(willLoadFromCache)
willLoadFromCache();
}
else {
if(willLoadFromNetwork)
willLoadFromNetwork();
}
[self findObjectsInBackgroundWithBlock:^(NSArray *objects,NSError *error) {
BOOL isCache = (cachePolicy == kPFCachePolicyCacheOnly);
if(block)
block(objects, error, isCache, true);
}];
}
else if(cachePolicy == kPFCachePolicyCacheElseNetwork || cachePolicy == kPFCachePolicyCacheThenNetwork) {
self.cachePolicy = kPFCachePolicyCacheOnly;
if(willLoadFromCache)
willLoadFromCache();
[self findObjectsInBackgroundWithBlock:^(NSArray *objects,NSError *error) {
BOOL done = (objects && cachePolicy == kPFCachePolicyCacheElseNetwork);
if(block)
block(objects, error, true, done);
if(! done || cachePolicy == kPFCachePolicyCacheThenNetwork) {
self.cachePolicy = kPFCachePolicyNetworkOnly;
if(willLoadFromNetwork)
willLoadFromNetwork();
[self findObjectsInBackgroundWithBlock:^(NSArray *objects,NSError *error) {
if(block)
block(objects, error, false, true);
}];
}
}];
}
else if(cachePolicy == kPFCachePolicyNetworkElseCache) {
self.cachePolicy = kPFCachePolicyNetworkOnly;
if(willLoadFromNetwork)
willLoadFromNetwork();
[self findObjectsInBackgroundWithBlock:^(NSArray *objects,NSError *error) {
BOOL done = (objects != nil);
if(block)
block(objects, error, false, done);
if(! done) {
self.cachePolicy = kPFCachePolicyCacheOnly;
if(willLoadFromCache)
willLoadFromCache();
[self findObjectsInBackgroundWithBlock:^(NSArray *objects,NSError *error) {
if(block)
block(objects, error, true, true);
}];
}
}];
}
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment