2

我实现了从 uiimagepickercontroller 到服务器的应用程序上传图像。但我想在上传过程中实现取消按钮来取消上传。

在上传功能中:

[operation setCompletionBlock:^{
    ProgressView.hidden = YES;
    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Uploading successfull." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [av show];
    [av release];
    overlayToolbar.userInteractionEnabled = YES;
    NSLog(@"response string: %@", operation.responseString); //Lets us know the result including failures
}];

NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[queue addOperation:operation];

和按钮取消:

[httpClient.operationQueue cancelAllOperations];

当我按下按钮取消时,它没有停止上传过程,然后出现alertview“上传成功”。我不知道为什么不能停止但仍然出现alertview。alertview 你能帮帮我吗?

4

1 回答 1

5

您正在取消错误的操作队列。您正在将操作添加到全新的,NSOperationQueue但您正在调用cancelAllOperationshttpClient.operationQueue

如果您在已添加操作的同一操作队列上取消上传,它应该可以工作。AFURLConnectionOperation.m这是取消时发生的情况:

- (void)cancel {
    [self.lock lock];
    if (![self isFinished] && ![self isCancelled]) {
        [self willChangeValueForKey:@"isCancelled"];
        _cancelled = YES;
        [super cancel];
        [self didChangeValueForKey:@"isCancelled"];

        // Cancel the connection on the thread it runs on to prevent race conditions
        [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];
    }
    [self.lock unlock];
}

关于操作队列的更多背景知识:

cancelAllOperations通常会取消所有挂起的操作。如果操作已经在进行中,则由操作取消它正在执行的操作(AFNetworking 正在处理这种情况)。

此方法向队列中当前的所有操作发送取消消息。排队的操作在开始执行之前被取消。如果一个操作已经在执行,则由该操作来识别取消并停止它正在执行的操作。

来源:http: //developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/occ/instm/NSOperationQueue/cancelAllOperations

这可能会对您有所帮助:http ://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

此外,在 AFNetworking 的特殊情况下,这也可能很有趣:如何使用 AFNetworking 立即强制取消 NSOperation?

于 2013-06-26T08:59:54.457 回答