2015-10-05 33 views
0

所以我對iOS和Swift(實際上只有一個半月)沒有任何意義。所以我試圖讓tableview顯示來自網絡的一些圖像,我設法從web API獲取正確的信息並將它們顯示在tableview中。但是,帶有在線圖像的桌面視圖似乎凍結了,我應該等待2-3秒才能移動一點,然後再次凍結,這非常令人沮喪。 我知道它與同步有關,我也試過dispatch_async(dispatch_get_main_queue()){},並且由於我使用Swift而不是ObJ進行開發,所以我嘗試了一個來自Github的開源Web Image下載助手,名爲Kingfisher,但它並沒有解決我的問題。 所以,請幫助我,謝謝。 爲了簡單起見,這裏的演示代碼在Swift語言中顯示webImages的UITableView似乎凍結了

var arrays = [ 
"NPWR02174_00_013F09F4AE3D70230FA695261A8E994D275DF62333/C878A05EF327D7D42E2AF5E1EE15672A1509962C.PNG", 
"NPWR04270_00_01C53CAC0BACAC6F052AE4B968370CF9B899DDA81E/C1E1A8AD62EDE2FB95C3BD562F2783F157A0D011.PNG", 
"NPWR04472_00_01CB90FF28A2EBB55D210932F56935B377E7A28ECB/DCA2F66365777A7330F685CD8CD5F90F2FE62671.PNG", 
"NPWR04841_00_017B982A2A44BB607DECD77484C4670CCB505B65E4/91824E16D16C2789CC34A2F5F5444CD30D71C8F1.PNG", 
"NPWR05212_00_018ADD99CEA95C240EFDC92FB993F6BC8C0AF7904D/7266E29159EE69D31AA24FB94BC0E90F5306774A.PNG", 
"NPWR05254_00_015EB28BB38A5580D6A73CA0BDFB2F8C6864F85F66/76ED779ECE98E63E8A1A229AE626F62E8325D703.PNG", 
"NPWR05257_00_01CB48AFF2A9F0795B5569E1DABBC612E3FA13B79A/3524288D6B1E5B4F51CF7DEA4A3E621913A1BA8C.PNG", 
"NPWR05326_00_01DF67B968910B06FDABD8A2C2C6AAB72E0DD47048/8AB6EC3EC992C35472F02DD0C8D4122302C802E1.PNG", 
"NPWR05401_00_0188285B6025E65909B39E295D2542DF589EDCCC38/620822A98E3CFC1CFB3B5EDCF3F00B19A5B328C2.PNG", 
] 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return arrays.count 

} 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = self.tableview.dequeueReusableCellWithIdentifier("gameCell")! 
    dispatch_async(dispatch_get_main_queue()){ 
     let image = cell.viewWithTag(101) as! UIImageView 

    let imageString = arrays[indexPath.row] as! String 

    let imageURL = NSURL(string: "https://trophy01.np.community.playstation.net/trophy/np/"+imageString)! 

    let data = NSData(contentsOfURL: imageURL)! 

     image.image = UIImage(data: data)} 

    return cell 

} 
+0

嘗試使用alamofire https://github.com/Alamofire/Alamofire或AlamofireImage https://github.com/Alamofire/AlamofireImage – kye

+0

我試圖用所謂的翠鳥另一個開源項目,它是一個快速的版本SDWebImage,它不起作用,所以我想我的代碼有問題。 – WhiteRice

+0

所以我嘗試了Alamofire,並且我使用了Alamofire.request(.GET,URL).responseJSON(){request,response,result)來獲取JSON結果併成功地將它們顯示在我的tableview中,但是...桌子視圖仍然凍結!我確實嘗試了所有可能的方法,也許在Alamofire中有一些我沒有使用的異步方法?請幫幫我。 – WhiteRice

回答

0

這是因爲你被同步下載圖像。這是這樣做的代碼行。

let data = NSData(contentsOfURL: imageURL) 

嘗試下載圖像異步,然後更新單元格,一旦圖像下載。結帳這個答案How to async load images on dynamic UITableView?

+0

,所以我改變了我的代碼,如下所示:dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0)){ let data = NSData(contentsOfURL:imageURL)! dispatch_async(dispatch_get_main_queue()){ image.image = UIImage(data:data)} }它確實加載圖片速度超快而且不會再次凍結,但是還有一個新問題,我加入了新的圖片,新圖片顯示在相同的位置cell ...非常奇怪 – WhiteRice

+0

您將需要實現圖像緩存機制,以便您不會重新下載已下載的圖像。 爲此, >創建一個可變的集合(數組或字典) >一旦圖像被下載,將它添加到您的收藏和更新細胞圖像 >把一個「如果其他‘中’的cellForRowAtIndexPath:」在這裏你需要首先檢查圖像是否已經存在於收藏中。如果是,那麼用高速緩存更新圖像,否則下載圖像。 – Saroj