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];
}];