我正在尝试将图像添加到tableview单元格,但没有太多运气让它显示出来。
图像正在从文件系统(I println()
结果)加载为UIImage,但我似乎无法将其放入单元格。在关闭后放置println()
会显示在返回单元格后图像全部被加载。
这是我的代码:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell
let note = notes[indexPath.row]
let nsURL = NSURL(string: note.valueForKey("url") as! String)!
var loadError: NSError?
var image: UIImage?
assetsLibrary!.assetForURL(nsURL, resultBlock: { (asset) -> Void in
if let ast = asset {
let iref = ast.defaultRepresentation().fullResolutionImage().takeUnretainedValue()
image = UIImage(CGImage: iref)
println("The loaded image: \(image)")
}
}, failureBlock: {(error) -> Void in
loadError = error
})
cell.textLabel!.text = note.valueForKey("title") as? String
cell.imageView!.image = image
return cell
}
当我用以下内容替换闭包来加载项目本身的图像时,它会显示在表格中。这让我相信这不是因为故事板的设置方式存在问题。
UIImage(named: transportItems[indexPath.row])
非常感谢任何帮助。
答案 0 :(得分:2)
它不起作用。 cellForRowAtPathIndex是一个同步例程。 assetForURL是一个异步例程。它将在cellForRowAtPathIndex返回后很长时间返回数据。
这是你应该做的:有一个方法cachedAssetForURL,它立即返回资产,或者返回nil。如果它返回资产,则存储它。请记住,这必须尽可能高效,因为当用户在图像中上下滚动时会调用此方法。
如果方法返回nil,则在后台触发下载。下载完成后,甚至不要尝试将图像存储在单元格中 - 此时,相同的单元格可能会显示完全不同的对象!而是存储数据,以便cachedAssetForURL能够返回资产,并使表视图的行无效。
答案 1 :(得分:0)
在块中触发通知(它是异步的),通过设置imageview并重新加载视图来管理它。
答案 2 :(得分:0)
正如@ gnasher729所指出的那样,我遇到的根本问题是同步和异步调用的混乱。重写代码以考虑到这一点并包含缓存,我有以下工作解决方案。
function fetchTransMain($trans, $itemID, $echo){
$str="";
ob_start();
foreach($trans as $key => $val){
if($val["ID"] == $itemID){
echo $val["trans"]; // Echo the value
}
}
$str = ob_get_buffer();
if($echo) ob_end_flush();
else ob_end();
return $str;
}
这可以进一步改进,以便从主线程中获得更多。