2014-03-19 77 views
0

我在UITableView單元格內顯示的背景下載圖像。有什麼辦法強制異步NSURLConnection在後臺調用connectionDidFinishLoading?

圖像直到UITableView停止滾動時才顯示。

我想以更快的方式顯示下載的圖像。例如,我想在UITableView開始減速時執行此操作。

爲此,我需要知道何時下載完成,直到調用connectionDidFinishLoading之前我無法知道它。 UITableView移動時不調用此方法。 (或可能在界面忙)

是否有可能以某種方式在UI忙時調用connectionDidFinishLoading,使用NSURLConnection同步使用而不使用

回答

1

這裏就是你要做的:

  • 有核心數據的網絡連接更新對象。
  • 在UITableView或Controller周圍的某處設置NSFetchedResultsController以查詢該類型的對象,例如, article對象上的images集合。
  • 將UiTableView數據源綁定到NSFetchedResultsController - 即表中的部分和行來自結果。

此時,表格視圖應該在滾動時成功顯示任何舊/當前項目。現在,...

  • 當您的下載完成(可能是與例如文章相關的圖像)時,以某種方式更新CoreData中的對象 - 例如,只需將image插入到名爲imagesarticles集合中 - 結果控制器將根據您設置的初始謂詞「查看」。如果新對象(article,image,whatever)的indexPath當前可在tableView中查看,那麼tableView和results控制器會將它散列出來。

實際上你應該在這一點上完成,新的圖像可能會出現。結果控制器是KVO爲您觀察。你需要採取行動與結果控制器得到的變化,但有很多的例子,如this(和方法之間有很多差異)。如果沒有,你可能需要做一些無害的事情 - 例如當新文章出現時滾動到頂部;避免打電話reloadData,除非你絕對必須。

更新

如果你只是想執行NSURLConnection的同步或異步操作,那麼所有你需要做的就是設置使用+ (NSURLConnection *)connectionWithRequest:(NSURLRequest *)request delegate:(id <NSURLConnectionDelegate>)delegate的NSURLConnection的(或相關的初始化)和- (void)start代替+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error。第一種方法異步加載數據,而後者是同步的。

但是,既然你提到了connectionDidFinishLoading,你似乎是異步設置連接,不是嗎?

+0

謝謝你的演練,但是,這仍然不是直接或間接幫助我的問題:是不是有辦法代替同步使用NSURLConnection? – frankish

+0

@frankish ^^^更新 – greymouser

0

在後臺運行同步NSURLConnection的一種簡單方法是使用GCD。

dispatch_async(dispatch_get_global_queue(0,0),^ {

    // Do your synchronous NSURLConnection and handle the response 


         dispatch_async(dispatch_get_main_queue(), ^{ 

          // update UI 

         }); 
       }); 

您還可以使用SDWebImage是很好地處理圖像加載。 https://github.com/rs/SDWebImage

相關問題