I had implemented FBLPromiseAwait for firebase. It basically gets some data from firebase node and iterate for various condition. This takes around 15 seconds for 605 records, while iteration with normal firebase functions takes only 2 to 3 seconds i.e
here is my sample code FBLPromiseAwait.
NSArray*notification_keys = [notifications allKeys];
for(int notification_count=0;notification_count<[notification_keys count ];notification_count++)
{
NSDictionary*obj = [notifications objectForKey:[notification_keys objectAtIndex:notification_count]];
NSString *notifType = [[obj objectForKey:@"data"] objectForKey:@"type"];
NSString *timeString = [[PBDateFormatter sharedFormatter] getCustomDateStringForChat:[NSDate dateWithTimeIntervalSince1970:[[[obj objectForKey:@"data"] objectForKey:@"timestamp"] longLongValue]/1000]];
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:[[obj objectForKey:@"notification"] objectForKey:@"title"] attributes:@{NSFontAttributeName : [UIFont fontWithName:PINGBUDS_FONT_NORMAL size:12], NSForegroundColorAttributeName : [UIColor blackColor]}];
//SOMEREFERENCE,conversation/deleteByInitiatingUser
if([notifType isEqualToString:@"SOMEREFERENCE"] || [notifType isEqualToString:@"conversation/deleteByInitiatingUser"] )
{
NSDictionary*userData = FBLPromiseAwait(
[FBLPromise async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock __unused _) {
[[[[[[FIRDatabase database] reference] child:USERS_TABLE] queryOrderedByChild:@"user_id"] queryEqualToValue:[[obj objectForKey:@"data"] objectForKey:@"user_id"]] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot){
fulfill([[snapshot.value allObjects] firstObject]);
}];
}], &error);
NSLog(@"\n promise user userData - %@",userData);
NSDictionary*skillFound = FBLPromiseAwait(
[FBLPromise async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock __unused _) {
[[[[[[FIRDatabase database] reference] child:SOME_TABLE] queryOrderedByChild:@"id"] queryEqualToValue:[[obj objectForKey:@"data"] objectForKey:@"skill_id"]] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot){
NSLog(@"\n\n obj at moment - %@",obj);
fulfill([[snapshot.value allObjects] firstObject]);
}];
}], &error);
[_dataSource addObject:model];
//Ends : SOMEREFERENCE,conversation/deleteByInitiatingUser
}
else if([components[0] isEqualToString:@"XXX"]){}
else if([notifType isEqualToString:@"YYYY"]){}
else if([notifType isEqualToString:@"zzzz"]){}
else if([notifType isEqualToString:@"pppp"]){}
}
dispatch_async(dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUDForView:self.view animated:YES];
[self do_some_ui_stuff];
});
if (error) {
return error;
}
return _dataSource;
}];`