2011-05-13 27 views
1

現在,我正嘗試使用FBConnect將照片圖像上傳到Facebook。 我成功地從主線上傳圖像,但是,它阻塞了很長時間的用戶界面。如何使用NSURLConnection異步上傳大圖像?

所以,我試圖使用dispatch_async解決阻塞問題。通過使用調度隊列,可以解決UI阻止問題,但照片數據上傳不再起作用。

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           img, @"picture", 
           nil]; 
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

[params retain]; 
dispatch_async(aQueue, ^{   
    [facebook requestWithMethodName:@"photos.upload" 
          andParams:params 
         andHttpMethod:@"POST" 
         andDelegate:self]; 
    [params release]; 
    dispatch_async(aQueue, ^{ [uploadingIndicator stopAnimating]; }); 
}); 

我覺得這個問題與NSURLConnection有關。 FBConnect使用NSURLConnection將圖像數據發佈到Facebook。如果我從調度隊列中調用FBConnect API,調度隊列線程中調用的NSURLConnection方法可能沒有運行循環。

_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

我試着用scheduleInRunLoop。但是,沒用。

_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
[_connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 

我該如何解決此問題?任何建議?

BR, Wonil。

+1

今天遇到同樣的問題,FBRequest的NSURLConnection在後臺線程中運行時不會調用委託方法。 (沒有使用塊)。這裏有一個類似的問題沒有答案:http://stackoverflow.com/questions/4626273/unable-to-upload-images-to-facebook-from-my-background-thread – 2011-05-13 18:43:20

+1

結束了使用ASIHTTPRequest,這在後臺線程。解決方案可能是微不足道的。學習會很有趣。 – 2011-05-13 18:43:56

回答

1

問題可能是您在後臺線程中運行了多個UIKit方法。所有與UIKit的交互都必須在處理所有用戶輸入的主線程中完成。

我不熟悉你使用的Facebook API方法,但它似乎是與UIImage一起工作。如果您可以使用它支持CGImage,或者使用不與任何UIKit對象交互的其他方法,則可以解決該問題。 (同樣,由於我沒有使用任何Facebook API,因此我無法幫助您。)另外,您需要從主線程調用UIActivityIndicatorView方法stopAnimating

你可以設置隊列是這樣的:

dispatch_queue_t myQueue = dispatch_queue_create("anyName", NULL); 

dispatch_async(myQueue, ^{ 
    // upload image to Facebook, but without using UIKit methods 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [uploadingIndicator stopAnimating]; 
    }); 
}); 
dispatch_release(myQueue); 

這樣一來,你可以做你的繁重的工作在後臺線程,並返回到主線程調用任何UIKit的方法。

更正:UIImage以及UIColor和UIFont都是可以在主線程之外安全地進行交互的UIKit對象的例外。 UIKit的其餘大部分不是線程安全的,當然包括UIImageView。 (我傾向於在深夜將UIImageUIImageView混淆)。