我有问题。我想从互联网上下载图像,并在下载时显示“指示符”。问题是当没有互联网连接时,方法“已下载从”进入“ if error!= nil ”,因此“指标”永远不会中断。这是我的代码。
Chromosome
修改
var imageArray:[String]! = ["http://findicons.com/files/icons/1072/face_avatars/300/a01.png", "http://findicons.com/files/icons/1072/face_avatars/300/a02.png", "http://findicons.com/files/icons/1072/face_avatars/300/a03.png", "http://findicons.com/files/icons/1072/face_avatars/300/a04.png", "http://findicons.com/files/icons/1072/face_avatars/300/a05.png"]
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let newCell = tableView.dequeueReusableCellWithIdentifier("userCell") as! UserCell_TableViewCell
let selectedUser = userArray[indexPath.row]
newCell.userDescription?.text = selectedUser.getFirstName() + " " + selectedUser.getLastName()
let randomNumber = arc4random_uniform(4)
let arrayIndex = Int(randomNumber)
let urlImage = imageArray[arrayIndex]
newCell.loadIndicator.startAnimating()
downloadedFrom(urlImage) { userImage in
dispatch_async(dispatch_get_main_queue()){
newCell.userImage.image = userImage
newCell.loadIndicator.stopAnimating()
}
self.userArray[indexPath.row].setImage(userImage)
}
return newCell
}
func downloadedFrom(urlLink :String, completionHandler: (UIImage) -> ())
{
if let urlData = NSURL(string: urlLink) {
NSURLSession.sharedSession().dataTaskWithURL(urlData) { (data, response, error) in
if error != nil {
print("error=\(error)")
return
} else {
if let httpResponse = response as? NSHTTPURLResponse {
let userImage = httpResponse.statusCode == 200 ? UIImage(data: data!) : UIImage(named: "unknownImage")
completionHandler(userImage!)
}}
}.resume()
}
}
让我这样做的问题是,我需要你下载图像以将其保存到数组中,方法中的数组完整性cellForRowAtIndexPath
答案 0 :(得分:1)
首先,我想提一下,尝试在表格单元格方法中调度加载循环(即使在单独的线程中)是不好的做法。您正在执行的块将捕获newCell
指针,因此如果在将单元格移出表格并重新使用后加载图像,则图像将被加载到错误的表格单元格中。
解决问题的最佳方法是将加载函数移动到单元格的类本身。因此,在配置单元格时,只需提供指向单元格的链接,然后让单元格处理图像加载。
要解决最初的问题,您可以修改加载过程,以便在单元格移出表格时(如果调用prepareForReuse()
),取消加载过程。
在单元格的类中,您可以添加对Internet连接的检查,以便在返回错误时停止指示符。当您将功能移动到单元格的类时,这将变得更加清晰。