Блоки в рамках NSOperation - PullRequest
       24

Блоки в рамках NSOperation

2 голосов
/ 14 февраля 2012

Я использую AFNetworking для выполнения URL-запроса и определения блоков успеха / ошибок в NSOperation - так что это в основном работает асинхронный процесс в NSOperation.

Я понимаю оговорку, лежащую в основе этого подхода, поскольку NSOperation завершится преждевременно, прежде чем будут вызваны методы делегата, и поэтому реализовал одно из предложенных решений, запустив start () в главном потоке (соответствующий пост Асинхронные методы в NSOperation ).

Пока все хорошо, я вижу, что порядок выполнения правильный, то есть блок успеха выполняется, выполняется, затем вызывается dealloc. До этого есть (системный?) Поток с именем __destroy_helper_block, который ссылается на блок успеха в NSOperation, который на этом этапе был освобожден. Что именно это? AFNetworking хранит ссылку на блок?

Стек вызовов в этом потоке:

objc_release
_destroy_helper_block
_Block_release
__destroy_helper_block
_Block_release
start_wqthread

Код

- (void) start {
    ...
    void (^successHandler)(NSURLRequest *, NSHTTPURLResponse*, NSXMLParser *) = ^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
    URLRequestParserDelegate *parserDelegate = [[URLRequestParserDelegate alloc]initWithChildDelegate:self];

        // child to handle connection success
        [self handleSuccess:request response:response];

        // parse xml response data
        [XMLParser setDelegate:parserDelegate];     
        [XMLParser parse];
        [parserDelegate release];
        [self finish];
    }; // EXC_BAD_ACCESS on this line (?)

    AFXMLRequestOperation *op = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request 
    success:successHandler failure:nil];
    [op start];
}

1 Ответ

0 голосов
/ 08 марта 2012

Я только знаю, что это легко сделать с помощью ASINetworkQueue:

- (void) process {

    //Create downloadQueue
    if (![self queue]) {
        [self setQueue:[[[ASINetworkQueue alloc] init] autorelease]];
        [[self queue] setDelegate:self];
        [[self queue] setShouldCancelAllRequestsOnFailure:NO];
        [[self queue] setQueueDidFinishSelector:@selector(queueFinished:)];
    }

    [ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://www.YOURURL.com/"]];
    [[self queue] addOperation:request]; //queue is an NSOperationQueue
    NSLog(@"request added to operation");

    [request setCompletionBlock:^{

        NSLog(@"response headers %@", [request responseHeaders]);
        NSLog(@"response body %@", [request responseString]);

    }];

    [request setFailedBlock:^{

        NSLog(@"response error: %@", [[request error] localizedDescription]);

    }];
}

- (void)queueFinished:(ASINetworkQueue *)queue{
    NSLog(@"queueFinished:");
}  
...