我想在後臺運行應用程序時執行圖片上傳。我可以使用此鏈接上的代碼將圖像上傳到服務器。 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];
});
發佈塊和GCD代碼。 – zaph
對不起,添加了阻塞的東西,遲了.... – LittleFunny