我意识到这个问题有几个类似的问题,我确实检查过很多问题。但是,我检查的那些是用错误的语言,或者不是我想要的,所以我问了一个新的问题。作为参考,我在Swift 2中使用XCode 7.3.1。
我的新iOS应用程序有一个功能是在互联网上搜索数据,并通过填充UITableView显示结果。我的问题是它在每个单元格中显示图片,这使得滚动非常烦人。
我理想的解决方案是拥有默认图片显示,同时允许用户继续滚动,它将在后台下载。然后,一旦它检索到它,它将替换默认值。我之前看到了一些关于如何做到这一点的答案,但没有一个对我有用。
P.S。如果您看到另一个问题解决了SWIFT的这个问题,请发布网址,我将删除此网址。
这是我目前正在使用的代码(有滞后):
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // Creates each cell, by parsing through the data received from the Employees array which we returned from the database
if (Employees.count == 0)
{
let cell = self.ResultsTable.dequeueReusableCellWithIdentifier("NORESULT", forIndexPath: indexPath) as! TruckSearchNRTableViewCell
return cell
}
else {
let cell = self.ResultsTable.dequeueReusableCellWithIdentifier("RESULT", forIndexPath: indexPath) as! TruckSearchTableViewCell
cell.companyLabel.text = Employees[indexPath.row]["CompanyName"] as? String
cell.nameLabel.text = Employees[indexPath.row]["EmployeeName"] as? String
if let mobile = Employees[indexPath.row]["PhoneNumber"] as? String {
if (mobile == "")
{
cell.mobileLabel.hidden = true
cell.mobileTitle.hidden = true
} else {
cell.mobileTitle.hidden = false
cell.mobileLabel.hidden = false
}
let phonenumber = mobile.stringByReplacingOccurrencesOfString("[^0-9]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil);
cell.phoneNumber.text = phonenumber
}
cell.titleLabel.text = Employees[indexPath.row]["JobTitle"] as? String
cell.truckLabel.text = Employees[indexPath.row]["TruckNumber"] as? String
cell.supervisorLabel.text = Employees[indexPath.row]["SupervisorName"] as? String
if (Employees[indexPath.row]["Synced"] as? Int) == 0 {
turnRed(cell)
} else {
turnBlack(cell)
}
if let ePhoto = Employees[indexPath.row]["PicLocation"] as? String { // Save complete URL of picture location, and save it to the table
let url = NSURL(string: "https://exampleurl.com/\(ePhoto)")!
if let data = NSData(contentsOfURL: url){
let myImage = UIImage(data: data)
cell.employeePhoto.image = myImage
}
else
{
cell.employeePhoto.image = UIImage(named: "person-generic")
}
}
return cell
}
}
答案 0 :(得分:3)
问题是你正在检索主线程上的图片,这会阻止它。所有UI操作(包括滚动)都在主线程上执行,这就是为什么它现在不稳定。
要解决此问题,而不是:
if let data = NSData(contentsOfURL: url){
let myImage = UIImage(data: data)
cell.employeePhoto.image = myImage
} else {
cell.employeePhoto.image = UIImage(named: "person-generic")
}
将图像请求放在后台线程上,然后再次在主线程上设置图像。
例如
let qos = QOS_CLASS_USER_INITIATED
dispatch_async(dispatch_get_global_queue(qos, 0), {
if let data = NSData(contentsOfURL: url){
let myImage = UIImage(data: data)
dispatch_async(dispatch_get_main_queue(), {
cell.employeePhoto.image = myImage
})
} else {
dispatch_async(dispatch_get_main_queue(), {
cell.employeePhoto.image = UIImage(named: "person-generic")
})
}
})
或者您可以使用异步URL会话来获取如下数据:
let request: NSURLRequest = NSURLRequest(URL: url)
let mainQueue = NSOperationQueue.mainQueue()
NSURLConnection.sendAsynchronousRequest(request, queue: mainQueue, completionHandler: { (response, data, error) -> Void in
if error == nil {
let myImage = UIImage(data: data)
dispatch_async(dispatch_get_main_queue(), {
cell.employeePhoto.image = myImage
})
} else {
dispatch_async(dispatch_get_main_queue(), {
cell.employeePhoto.image = UIImage(named: "person-generic")
})
}
})