2011-09-26 85 views
0

我想在後臺運行應用程序時執行圖片上傳。我可以使用此鏈接上的代碼將圖像上傳到服務器。 How can I upload a photo to a server with the iPhone?iPhone:文件上傳使用dispatch_async進行背景上傳

我聽說NSUrlConnection可以是異步的,它被用在EPUploader中。在我的代碼中,我添加了一些額外的方法,將在用於EPUploader的應用程序目錄中創建一個文件。在創建文件的過程中,我不希望它在應用程序的主線程上創建,因此我將全部代碼(包括EPUploader本身)與 dispatch_async包裝在全局隊列中。這樣我就不會在文件創建時阻塞主線程。

如果我使用dispatch_sync它有沒有問題,但dispatch_async我覺得很奇怪,當我放置在NSURLConnection的連接斷點:

- (void)upload 

{

NSData *data = [NSData dataWithContentsOfFile:filePath]; 
    //ASSERT(data); 
    if (!data) { 
      [self uploadSucceeded:NO]; 
     return; 
    } 
    if ([data length] == 0) { 
     // There's no data, treat this the same as no file. 
     [self uploadSucceeded:YES]; 
     return; 
    } /* blah blah */ 
    NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 

    if (!connection) { 
     [self uploadSucceeded:NO]; 
     return; 
    } 
    else 
     return; 

我去斷點調試和而不是去if語句,調試器跳轉到這個方法的第一個return語句。之後,我傳遞給這個類的選擇器永遠不會被調用。這隻發生在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]; 


}); 
+0

發佈塊和GCD代碼。 – zaph

+0

對不起,添加了阻塞的東西,遲了.... – LittleFunny

回答

1

有幾件事情應該改變。

  1. 刪除NSAutoreleasePool,這是不需要的。
  2. 將塊複製到堆中,因爲它的壽命可能會超過調用代碼的壽命。

例子:

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(你肯定是因爲你應該是)沒有必要爲copyautorelease

+0

感謝您的回覆...我已經嘗試,但它給了相同的結果,當我把斷點。 – LittleFunny