我使用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 中,我准备了我的单元格,这对于每种类型的帖子都是不同的。我有类型视频,照片,链接和正常状态。
因此,如果用户发布链接(或在生活事件等中标记),我的单元格将如下所示:
现在,有一个名为 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"而且我不知道如何解决这个问题。我认为它与完成处理程序和对表视图单元格的引用有关。
有人可以帮我吗?
答案 0 :(得分:0)
好的,我明白了。 Xcode向我显示错误行中的错误。我的代码工作正常。问题是:我无法在完成处理程序中访问单元格图像视图(这两行:
(cell as NewsFeedVideoStatusTableViewCell).progressView.stopSpinProgressBackgroundLayer()
(cell as NewsFeedVideoStatusTableViewCell).progressView.removeFromSuperview()
如果我将这两行放在主线程上,总是崩溃,它甚至无法工作。在图像下载完成后,必须找到一种解决方法来隐藏我的进度视图。