我有一个View控制器,我有一个按钮,可以调出前置摄像头。然后用户拍摄照片,相机控制器被解除,我在视图控制器的图像视图中显示拍摄的照片。现在,我开始将服务器上传到Amazon S3。
上传完成需要一些时间,用户必须等待那段时间才能转到下一个视图。
我最好将用户移动到下一个视图,然后在后台完成上传。有什么方法可以在后台执行此上传任务吗?我知道他们的名字是dispatch_queue
可以用来做这件事,但我不知道怎么做。如果我将上传代码放在视图控制器文件的队列中,然后移动到下一个视图控制器,则不会丢失前一个视图控制器的引用。
修改
我尝试过以下操作 -
AmazonServiceRequest
的委托,当上传到Amazon S3完成时应该调用它。dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);
dispatch_async(queue, ^{
RIDEUploadPhotoService *uploadPhotoServiceObj = [[RIDEUploadPhotoService alloc] init;
[uploadPhotoServiceObj uploadAndSaveImage:imageToSave];
});
在我看来,控件永远不会进入请求完成,当上传到Amazon S3完成时应该调用它。
答案 0 :(得分:1)
只需使用NSURLConnection / NSURLSession的异步上传机制之一,这样您就不必乱用后台线程了。例如:
NSURL *fileURL = [NSURL fileURLWithPath:...];
NSURLRequest *request = [NSURLRequest requestWithURL:...];
// modern way: NSURLSession
NSURLSessionUploadTask *uploadTask = [[NSURLSession sharedSession] uploadTaskWithRequest:request fromFile:fileURL completionHandler:...];
[uploadTask resume];
// old way: NSURLConnection
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:...];
// another old way: synchronous NSURLRequest executed in a background queue
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURLResponse *response;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
});
答案 1 :(得分:0)
没有。参考不会丢失。
您可以使用- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
在后台执行方法aSelector
。如果在完成任务后您有任何代表,他们仍然会被调用。