Извлечь блок обработчика завершений в метод с использованием typdef - PullRequest
1 голос
/ 07 апреля 2020

Я бы хотел немного очистить свой код и извлечь блок завершения для его собственного метода. Насколько я понимаю, я должен определить typdef с той же подписью. В приведенном ниже примере я хочу переместить обработчик завершения NSURLSessionUploadTask в его собственный метод. Я посмотрел на документацию Apple и другие вопросы SO, но я не знаю, ищу ли я правильную вещь.

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

1 Ответ

1 голос
/ 07 апреля 2020

someMethodThatTakesABlock: имеет единственный параметр, который является блоком. Блок является ссылкой на код, который может быть выполнен. Он не содержит данных.

Если вы хотите выделить обработку завершения для отдельного метода, напишите метод

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

...