SDWebImageView在UITableViewCell中使用UIImageView

时间:2015-02-21 13:56:44

标签: ios facebook uitableview swift uiimageview

我使用Facebook Graph API来获取某些用户的一些帖子,并希望在我的应用中显示它们。为了简单起见,以下是我从图谱API获取帖子的方法:

FBRequestConnection.startWithGraphPath("/me/home", parameters: ["limit" : 20, "fields" : "id,from,to,message,type,link,story,picture,object_id", "until" : 1424364646], HTTPMethod: "GET", completionHandler: {(FBRequestConnection connection, AnyObject result, NSError error) -> () in
        if let json = result as? NSMutableDictionary {
            self.newsFeedPostsJSON = json
            self.dataArray = self.newsFeedPostsJSON.objectForKey("data") as [FBGraphObject]!
            dispatch_async(dispatch_get_main_queue(), {() in
                self.tableView.reloadData()
            })
       }
})

效果很好(不要介意我在这里设置的参数)。现在,我有 self.dataArray ,它存储了此请求返回的所有帖子。

在我的 tableView:cellForRowAtIndexPath 中,我准备了我的单元格,这对于每种类型的帖子都是不同的。我有类型视频,照片,链接和正常状态。

因此,如果用户发布链接(或在生活事件等中标记),我的单元格将如下所示: enter image description here

现在,有一个名为 SDWebImage https://github.com/rs/SDWebImage)的优秀框架,它是UIImageView的一个扩展,可以异步下载图像。

现在,这是函数:

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

    var cell : StatusTableViewCell!

    var graphObject = self.dataArray[indexPath.row] as FBGraphObject

    if let type = graphObject.objectForKey("type") as? String {
        switch(type) {
            case "video":
                cell = tableView.dequeueReusableCellWithIdentifier(self.NewsFeedVideoStatusCellIdentifier, forIndexPath: indexPath) as? NewsFeedVideoStatusTableViewCell
                cell.setupProgressView()
                if let picture = graphObject.objectForKey("picture") as String? {
                    var pictureURL = NSURL(string: picture)
                    (cell as NewsFeedVideoStatusTableViewCell).videoThumbImageView.sd_setImageWithURL(pictureURL, completed: {(image: UIImage!, error : NSError!, cacheType : SDImageCacheType!, url) -> Void in
                        (cell as NewsFeedVideoStatusTableViewCell).progressView.stopSpinProgressBackgroundLayer()
                        (cell as NewsFeedVideoStatusTableViewCell).progressView.removeFromSuperview()
                    })
                }
            case "link":
                cell = tableView.dequeueReusableCellWithIdentifier(self.NewsFeedLinkStatusCellIdentifier, forIndexPath: indexPath) as? NewsFeedLinkStatusTableViewCell
                cell.setupProgressView()
            case "photo":
                cell = tableView.dequeueReusableCellWithIdentifier(self.NewsFeedPhotoStatusCellIdentifier, forIndexPath: indexPath) as? NewsFeedPhotoStatusTableViewCell
                cell.setupProgressView()
                if let objectID = graphObject.objectForKey("object_id") as String! {
                    FBRequestConnection.startWithGraphPath("/\(objectID)", parameters: ["fields" : "images"], HTTPMethod: "GET", completionHandler: {(FBRequestConnection connection, AnyObject result, NSError error) -> () in
                        if let imagesArray = (result as NSDictionary).objectForKey("images") as NSArray? {
                            (cell as NewsFeedPhotoStatusTableViewCell).photoImageView.sd_setImageWithURL(self.getImageURLwithWidthAndHeightBetween(imagesArray, lower: 200, upper: 500), completed: {(image: UIImage!, error: NSError!, cacheType: SDImageCacheType!, url) -> Void in
                                (cell as NewsFeedPhotoStatusTableViewCell).progressView.stopSpinProgressBackgroundLayer()
                                (cell as NewsFeedPhotoStatusTableViewCell).progressView.removeFromSuperview()
                            })
                        }
                    })
                }
            default:
                cell = tableView.dequeueReusableCellWithIdentifier(self.NewsFeedNormalStatusCellIdentifier, forIndexPath: indexPath) as? NewsFeedNormalStatusTableViewCell
        }
    }

因此,我的视频的tableview单元看起来与查找链接几乎相同。视频有一个小缩略图,其URL在JSON对象中提供,其中包含键' 图片'。

说到那条线

(cell as NewsFeedVideoStatusTableViewCell).videoThumbImageView.sd_setImageWithURL(pictureURL, completed: {(image: UIImage!, error : NSError!, cacheType : SDImageCacheType!, url) -> Void in

我的应用程序崩溃了。 Xcode给出了错误" EXC_BAD_ACCESS"而且我不知道如何解决这个问题。我认为它与完成处理程序和对表视图单元格的引用有关。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

好的,我明白了。 Xcode向我显示错误行中的错误。我的代码工作正常。问题是:我无法在完成处理程序中访问单元格图像视图(这两行:

(cell as NewsFeedVideoStatusTableViewCell).progressView.stopSpinProgressBackgroundLayer()
(cell as NewsFeedVideoStatusTableViewCell).progressView.removeFromSuperview()

如果我将这两行放在主线程上,总是崩溃,它甚至无法工作。在图像下载完成后,必须找到一种解决方法来隐藏我的进度视图。