Каков наилучший способ отследить несколько экземпляров ASIHTTPRequest? - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть некоторый код, который отправляет несколько ASIHTTPRequests для загрузки и выгрузки данных в контроллере представления. Когда контроллер представления получает dealloc'd, он должен очистить все незаконченные запросы, установив делегат равным nil.

- (void)viewDidLoad
{
        // send multiple requests
        [self sendRequest:someURL];
        [self sendRequest:someURL];
        [self sendRequest:someURL];
        [self sendRequest:someURL];
}

- (void)sendRequest:(NSString*)url
{
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        [request setDelegate:self]; 

        ASINetworkQueue *requestQueue = [ASINetworkQueue queue];
        [requestQueue setMaxConcurrentOperationCount:2];
        [requestQueue setDelegate:self];
        [requestQueue addOperation:request];
        [requestQueue go];
}

- (void)dealloc
{
    NSLog(@"cancel all operations");
    for (ASIHTTPRequest *req in ASIHTTPRequest.sharedQueue.operations)
    {
        [req cancel];
        [req setDelegate:nil];
    }

    [super dealloc];
}

Однако, если я вытолкаю этот контроллер представления до завершения всех операций, я получаю «сообщение, отправленное на освобожденный экземпляр» в ASIHTTPRequest.m с жалобой на то, что делегат исчез в приведенном ниже коде.

/* ALWAYS CALLED ON MAIN THREAD! */
- (void)reportFailure
{
    ***crash here --> if (delegate && [delegate respondsToSelector:didFailSelector]) {
        [delegate performSelector:didFailSelector withObject:self];
    }
    if (queue && [queue respondsToSelector:@selector(requestFailed:)]) {
        [queue performSelector:@selector(requestFailed:) withObject:self];
    }
    #if NS_BLOCKS_AVAILABLE
    if(failureBlock){
        failureBlock();
    }
    #endif
}

Как я могу обойти это?

Ответы [ 2 ]

4 голосов
/ 10 сентября 2011

Вы создаете новую очередь для каждого запроса вокруг этой строки кода:

ASINetworkQueue *requestQueue = [ASINetworkQueue queue];

Так что цикл здесь не будет зацикливаться на запросах, поскольку он зацикливается на sharedQueue, а не на новомВы создали:

for (ASIHTTPRequest *req in ASIHTTPRequest.sharedQueue.operations)

Запросы добавляются в sharedQueue только в том случае, если вы используете [request startAynchronous] без явного задания другой очереди.

2 голосов
/ 10 сентября 2011

Возможно, я что-то упускаю, но я думаю, что ожидание до dealloc слишком поздно, вы хотите отменить свои операции на viewWillDisappear или viewDidUnload

...