Интеграция AFNetworking AFXMLRequestOperation в мой собственный метод с обратным вызовом завершения блока

Я использую метод AFXMLRequestOperation замечательного AFNetworking. То, что я хотел бы использовать, это использовать следующее, но обернуть вокруг него свой собственный метод с моим собственным обратным вызовом завершения.

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://api.flickr.com/services/rest/?method=flickr.groups.browse&api_key=b6300e17ad3c506e706cb0072175d047&cat_id=34427469792%40N01&format=rest"]];
AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
  XMLParser.delegate = self;
  [XMLParser parse];
} failure:nil];
[operation start];

Можно ли сделать что-то вроде следующего?

+ (void)makeRequestWithURL:(NSURL *)url completion:(void (^)(BOOL finished))completion {

    NSURLRequest *request = [NSURLRequest requestWithURL:url]];
    AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
        XMLParser.delegate = self;
        [XMLParser parse];
    } failure:nil];
    [operation start];

    if (completion) {
        // How can I call my cometion block when AFXMLRequestOpersation is finished?
    }

}

Затем вызовите его, используя:

[MyClass makeRequestWithURL:url completion^(BOOL finished){
        if (finished) {
            NSLog(@"AFNetworking Finished");
        }
}];

Могу ли я узнать, когда AFNetworking закончился в МОЕМ блоке завершения?


person Nic Hubbard    schedule 04.11.2012    source источник
comment
Что должно олицетворять готовое - успех или неудачу?   -  person Paul.s    schedule 05.11.2012
comment
Предположим, чтобы представить успех.   -  person Nic Hubbard    schedule 05.11.2012


Ответы (2)


Просто вызовите свой блок завершения в блоке успеха:

+ (void)makeRequestWithURL:(NSURL *)url completion:(void (^)(BOOL finished))completion {

    NSURLRequest *request = [NSURLRequest requestWithURL:url]];
    AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
        XMLParser.delegate = self;
        [XMLParser parse];
        // call completion block here
        if (completion) {
          completion(YES);
        }

    } failure:nil];
    [operation start];
}

Вы также должны реализовать блок отказа AFXMLRequestOperation.

person Felix    schedule 04.11.2012

Предположим, что блок завершения будет выполняться независимо от результата с BOOL, показывающим успех/неудачу, он должен выглядеть следующим образом:

NSURLRequest *request = [NSURLRequest requestWithURL:url]];
AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
  XMLParser.delegate = self;
  [XMLParser parse];

  if (completion) {
    completion(YES);
  }

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParse) {

  if (completion) {
    completion(NO);
  }

}];
[operation start];
person Paul.s    schedule 04.11.2012