Skip to content

Instantly share code, notes, and snippets.

@aleclarson
Last active August 29, 2015 13:58
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 aleclarson/10315414 to your computer and use it in GitHub Desktop.
Save aleclarson/10315414 to your computer and use it in GitHub Desktop.
FBBatchRequest for Facebook iOS SDK

Example

FBBatchRequest* batchRequest = [[FBBatchRequest alloc] init];

for (NSInteger i = 0; i < 60; i++) {
  FBRequest* request = [FBRequest requestForGraphPath:"me/statuses?limit=1"];

  [batchRequest
    addRequest:request
    completionBlock:^(FBRequestConnection* connection, NSMutableDictionary* result, NSError* error) {
      NSLog(@"Result %li: %@", (long)i, result);
    }];
}

[batchRequest startWithCompletionBlock:^{
  NSLog(@"%@", @"Batch request completed");
}];
@interface FBBatchRequest : NSObject
#define emptyMutableArray [NSMutableArray array]
typedef void(^VoidCallback)();
- (void) addRequest:(FBRequest*)request completionBlock:(FBRequestHandler)completionBlock;
- (void) startWithCompletionBlock:(VoidCallback)completionBlock;
- (void) start;
@property (readonly) NSUInteger requestsCompleted;
@property (strong) VoidCallback completionBlock;
@property NSUInteger requestsPerBatch;
@end
#import "FBBatchRequest.h"
@interface FBBatchRequest () {
NSMutableArray *requests, *completionBlocks;
}
@property NSUInteger requestsCompleted;
@end
@implementation FBBatchRequest
- (instancetype) init {
self = [super init];
self.requestsCompleted = 0;
self.requestsPerBatch = 50;
requests = emptyMutableArray;
completionBlocks = emptyMutableArray;
return self;
}
- (void) addRequest:(FBRequest*)request completionBlock:(FBRequestHandler)completionBlock {
if (request == nil || completionBlock == nil) return;
[completionBlocks addObject:completionBlock];
[requests addObject:request];
}
- (void) startWithCompletionBlock:(VoidCallback)completionBlock {
self.completionBlock = completionBlock;
[self start];
}
- (void) start {
NSInteger const requestsCount = requests.count;
NSInteger const requestsPerBatch = self.requestsPerBatch;
NSInteger batchCount;
FBRequestConnection* connection;
for (NSInteger index = 0; index < requestsCount; index++) {
if (connection == nil) {
connection = [[FBRequestConnection alloc] init];
batchCount = 0;
}
batchCount++;
FBRequest* request = requests[index];
FBRequestHandler completionBlock = completionBlocks[index];
[connection addRequest:request completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
self.requestsCompleted++;
BOOL batchComplete = self.requestsCompleted == requestsCount;
completionBlock(connection, result, error);
if (batchComplete && self.completionBlock) self.completionBlock();
}];
if (batchCount == requestsPerBatch || index + 1 == requestsCount) {
[connection start];
connection = nil;
}
}
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment