2016年1月13日 星期三

iOS Bolts with AFNetworking Batch Request


Bolts-iOS is a Manage task libary by Facebook and Parse.
To solved async callbacks problem like  Promise Pattern.

When we need request batch use AFNetworking with bolts to manage request task.
Here is some sample code.

First use async BFTask to create request.
 @property (nonatomic, strong) AFHTTPSessionManager *manager;  
 - (BFTask *) executeEndPointAsync :(NSString *)url parameters:(id)parameters {  
   BFTaskCompletionSource *BFTask = [BFTaskCompletionSource taskCompletionSource];  
    AFHTTPResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializer];  
   self.manager.responseSerializer = responseSerializer;  
   [self.manager GET:url parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) {  
   } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {  
     //do something, save response   
     [BFTask setResult:responseObject];  
   } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {  
     [BFTask setError:error];  
   }];  
   return BFTask.task;  
 }  

And then run with executeEndPointAsync

 - (void)runTask{  
   [[[BFTask taskWithResult:nil]continueWithBlock:^id _Nullable(BFTask * _Nonnull task) {  
     BFTask *subTask = [BFTask taskWithResult:nil];  
     for (int i = 0; i < 100; i++) {  
       subTask = [subTask continueWithBlock:^id(BFTask * subTask) {  
         if (subTask.isCancelled) {  
         }else if(subTask.error){  
         }else{  
           //do http request  
           return [self executeEndPointAsync:@"http://..." parameters:nil];  
         }  
         return nil;  
       }];  
     }  
     return subTask;  
   }]continueWithSuccessBlock:^id _Nullable(BFTask * _Nonnull task) {  
     NSLog(@"Success");  
     return nil;  
   }];  
 }  


2016年1月12日 星期二

iOS UIWebView throw exception in runtime

While some JS will called webkit method,resulted in iOS unrecognized method.

[WebActionDisablingCALayerDelegate willBeRemoved]: unrecognized selector sent to instance

[WebActionDisablingCALayerDelegate removeFromSuperview]: unrecognized selector sent to instance

So I provided method in runtime,

+ (void)load{
Class class = NSClassFromString(@"WebActionDisablingCALayerDelegate");
SEL willBeRemoved = @selector(willBeRemoved);
class_addMethod(class, willBeRemoved, (IMP)willBeImplementation, nil);
}

void willBeImplementation(id self, SEL _cmd) {

}

While webkit call [WebActionDisablingCALayerDelegate willBeRemoved],
it was replaced by willBeImplementation.