在iOS中实现异步任务

时间:2014-06-19 13:15:24

标签: ios

我有一个View控制器,我有一个按钮,可以调出前置摄像头。然后用户拍摄照片,相机控制器被解除,我在视图控制器的图像视图中显示拍摄的照片。现在,我开始将服务器上传到Amazon S3。

上传完成需要一些时间,用户必须等待那段时间才能转到下一个视图。

我最好将用户移动到下一个视图,然后在后台完成上传。有什么方法可以在后台执行此上传任务吗?我知道他们的名字是dispatch_queue可以用来做这件事,但我不知道怎么做。如果我将上传代码放在视图控制器文件的队列中,然后移动到下一个视图控制器,则不会丢失前一个视图控制器的引用。

修改

我尝试过以下操作 -

  1. 创建一个负责上传到Amazon S3的新课程。
  2. 这个新类是AmazonServiceRequest的委托,当上传到Amazon S3完成时应该调用它。
  3. 完成上传到S3后,我打电话给我的服务器,将URL保存在数据库中。
  4. 我在队列块中创建了这个类的对象,如下所示 -
  5. 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完成时应该调用它。

2 个答案:

答案 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。如果在完成任务后您有任何代表,他们仍然会被调用。