Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IPhone:使用dispatch_async进行后台上传的文件上传_Iphone_File_Asynchronous_Upload_Background - Fatal编程技术网

IPhone:使用dispatch_async进行后台上传的文件上传

IPhone:使用dispatch_async进行后台上传的文件上传,iphone,file,asynchronous,upload,background,Iphone,File,Asynchronous,Upload,Background,我想在后台运行应用程序时执行图像上载。我能够上传图像到服务器使用此链接上的代码。 我听说NSUrlConnection可以是异步的,它被用于eUploader。在我的代码中,我添加了一些额外的方法,将在用于eUploader的应用程序目录中创建一个文件。在创建文件的过程中,我不希望它在应用程序的主线程上创建,所以我用 在全局队列上调度\u async。这样我就不会在创建文件时阻塞主线程 如果我使用dispatch_sync没有问题,但是dispatch_async我在NSUrlConnecti

我想在后台运行应用程序时执行图像上载。我能够上传图像到服务器使用此链接上的代码。

我听说NSUrlConnection可以是异步的,它被用于eUploader。在我的代码中,我添加了一些额外的方法,将在用于eUploader的应用程序目录中创建一个文件。在创建文件的过程中,我不希望它在应用程序的主线程上创建,所以我用 在全局队列上调度\u async。这样我就不会在创建文件时阻塞主线程

如果我使用dispatch_sync没有问题,但是dispatch_async我在NSUrlConnection上放置断点时发现了一些奇怪的东西:

- (void)upload
{

我在断点处进行了调试,而不是执行if语句,调试器跳转到此方法的第一个返回语句。之后,我传递给此类的选择器从未被调用。这只发生在dispatch_async上,它在全局队列上的dispatch_sync上工作

有人知道如何解决这个问题吗

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_async(queue, ^{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];     

    self.uploadIndex = 0;
    ALAsset *asset = [self.assets objectAtIndex:0];

    [[FileUploader alloc] initWithAsset:[NSURL URLWithString:@"http://192.168.0.3:4159/default.aspx"]
                                  asset:asset
                               delegate:self
                           doneSelector:@selector(onUploadDone:)
                          errorSelector:@selector(onUploadError:)];
    //[self singleUpload:self.uploadIndex];
    [pool release];


});

有几件事需要改变

  • 删除
    NSAutoreleasePool
    ,它不是必需的
  • 将块复制到堆中,因为它的寿命可能超过调用代码的寿命
  • 例如:

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    
        dispatch_async(queue, [[^{
            self.uploadIndex = 0;
            ALAsset *asset = [self.assets objectAtIndex:0];
    
            [[FileUploader alloc] initWithAsset:[NSURL URLWithString:@"http://192.168.0.3:4159/default.aspx"]
                                          asset:asset
                                       delegate:self
                                   doneSelector:@selector(onUploadDone:)
                                  errorSelector:@selector(onUploadError:)];
        } copy] autorelease]);
    

    如果您使用的是ARC(您当然是,因为您应该是),那么就不需要
    复制
    自动释放

    很抱歉这么晚才添加了块内容…感谢您的回复…我已经尝试过了,但当我放置断点时,它给出了相同的结果。
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    
        dispatch_async(queue, [[^{
            self.uploadIndex = 0;
            ALAsset *asset = [self.assets objectAtIndex:0];
    
            [[FileUploader alloc] initWithAsset:[NSURL URLWithString:@"http://192.168.0.3:4159/default.aspx"]
                                          asset:asset
                                       delegate:self
                                   doneSelector:@selector(onUploadDone:)
                                  errorSelector:@selector(onUploadError:)];
        } copy] autorelease]);