Objective c 使用typdef将完成处理程序块提取到方法中
我希望清理一些代码,并将一个完成块提取到它自己的方法中。我的理解是,我必须定义具有相同签名的Objective c 使用typdef将完成处理程序块提取到方法中,objective-c,objective-c-blocks,Objective C,Objective C Blocks,我希望清理一些代码,并将一个完成块提取到它自己的方法中。我的理解是,我必须定义具有相同签名的typdef。 在下面的示例中,我想将NSURLSessionUploadTask的on completion处理程序移动到它自己的方法。我看过苹果的文档和其他一些问题,但我不知道我是否在寻找正确的东西 typedef void (^PostCompletionHandler)(NSData *data,NSURLResponse *response,NSError *error); @interfac
typdef
。
在下面的示例中,我想将NSURLSessionUploadTask
的on completion处理程序移动到它自己的方法。我看过苹果的文档和其他一些问题,但我不知道我是否在寻找正确的东西
typedef void (^PostCompletionHandler)(NSData *data,NSURLResponse *response,NSError *error);
@interface MyDemoClass() {
@property (copy, nonatomic) PostCompletionHandler completePostHandler;
@end
@implementation MyDemoClass
- (void) post {
NSData *postData = //data to pos;
NSMutableURLRequest * req = //create request;
NSURLSession * session = // create session;
NSURLSessionUploadTask *queryTask = [session uploadTaskWithRequest:req
fromData:postData
completionHandler:^(NSData *data,NSURLResponse *response,NSError *error) {
if (error) {
NSLog(@"Error: %@",error.localizedDescription);
} else {
NSDictionary * response = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSLog(@"Post Response: %@",response.description);
}
}];
[queryTask resume];
}
- (void)someMethodThatTakesABlock:(PostCompletionHandler)blockName {
}
@end
这是我想做的事情是这样的:
NSURLSessionUploadTask *queryTask = [session uploadTaskWithRequest:req
fromData:postData
completionHandler:^(NSData *data,NSURLResponse *response,NSError *error) {
// What do I do here?
}];
- (void)someMethodThatTakesABlock:(PostCompletionHandler)blockName {
//how do I access the data, response and error parameters?
if (error) {
NSLog(@"Error: %@",error.localizedDescription);
} else {
NSDictionary * response = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSLog(@"Post Response: %@",response.description);
}
}
somemethodthatakesablock:
只有一个参数,即块。该块是对可以执行的代码的引用。它不包含数据
如果您想将完成处理分离到一个单独的方法,那么编写一个方法
- (void)processCompletionWithData:(NSData*)data response:(NSURLResponse*)response error:(NSError*)error {
// Process it...
}
然后在完成处理程序中
NSURLSessionUploadTask *queryTask =
[session uploadTaskWithRequest:req
fromData:postData
completionHandler:^(NSData* data, NSURLResponse* response, NSError* error) {
[self processCompletionWithData:data response:response error:error];
}];