2016-05-31 23 views
0

「空隙機能で予期しないvoid以外の戻り値」を示しています。コードがありますテーブルビューセル・ショーの画像は、私がTableViewCellで画像を表示したい問題

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cellIdentifier = "myCell" 
     let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! DIYSquareALLCell 
     cell.titles!.text = titles[indexPath.row] 
     cell.leftImages!.image = getPic(leftImages[indexPath.row]) 
     return cell 
    } 

func getPic(PicURL: String) -> UIImage! { 
     let image = self.imageCache[PicURL] as UIImage? 
     if image == nil { 
      let url = NSURL(string: PicURL.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!) 
      if let data = NSData(contentsOfURL: url!) { 
       imageCache[PicURL] = UIImage(data: data) 
       return UIImage(data: data)! 
      } 
     } else { 
      return image 
     } 
     return nil 
    } 

しかし、テーブルビューをスクロールするには、非常に私は機能を変更し、それにいくつかのdispatch_async機能を追加遅れています。

それは私のgetPic機能に問題が「空の関数で予期しないvoid以外の戻り値」を示しています。

私が変更された後、コードがあります

func getPic(PicURL: String) -> UIImage! { 
     let image = self.imageCache[PicURL] as UIImage? 
     if image == nil { 
      let url = NSURL(string: PicURL.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!) 
      let priority = DISPATCH_QUEUE_PRIORITY_HIGH 
      dispatch_async(dispatch_get_global_queue(priority, 0)) { 
       let data = NSData(contentsOfURL: url!) 
       if data != nil { 
        dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         self.imageCache[PicURL] = UIImage(data: data!) 
         return UIImage(data: data!)// here is the issue 
        }) 
       } 
      } 
     } else { 
      return image 
     } 
     return nil 
    } 

誰もがそれを修正する方法を教えてくださいできますか?ありがとう!非同期タスク、メインスレッドで実行されている機能を使用するときは、値を返すことはできません

答えて

0

は、オブジェクトをrとあなたの非同期タスクが終了するのは待機しません。

Closureでこれを行うことができます。

あなたのコードは次のようにする必要があります:GITにアップロード

typealias CompletionHandler = (image: UIImage) -> Void 
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell: testCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! testCell 
     downloadFileFromURL(NSURL(string: "http://img.youtube.com/vi/PCwL3-hkKrg/sddefault.jpg")!, completionHandler:{(img) in 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       cell.imgView.image = img 
      }) 

      }) 
     return cell 
    } 

    func downloadFileFromURL(url1: NSURL?,completionHandler: CompletionHandler) { 
     // download code. 
     if let url = url1{ 
     let priority = DISPATCH_QUEUE_PRIORITY_HIGH 
     dispatch_async(dispatch_get_global_queue(priority, 0)) { 
      let data = NSData(contentsOfURL: url) 
      if data != nil { 
       print("image downloaded") 
       completionHandler(image: UIImage(data: data!)!) 
      } 
      } 
     } 
    } 

サンプル・プロジェクト。

+1

あなたを愛しています... –

関連する問題