gpt4 book ai didi

ios - UITableView 滚动时滞后

转载 作者:行者123 更新时间:2023-11-28 11:05:25 25 4
gpt4 key购买 nike

我发现和这个类似的问题有好几个,我确实查了很多。但是,我检查过的语言要么是错误的语言,要么不是我要找的语言,因此我要问一个新问题。作为引用,我在 Swift 2 中使用 XCode 7.3.1。

我的新 iOS 应用程序有一个功能,可以在互联网上搜索数据,并通过填充 UITableView 来显示结果。我的问题是它在每个单元格中显示图片,这使得滚动非常烦人。

我理想的解决方案是有一个默认的图片显示,并且在允许用户继续滚动的同时,它会在后台下载。然后,一旦它检索到它,它将替换默认值。我看到了一些关于如何执行此操作的先前答案,但没有一个对我有用。

附言如果您看到使用 SWIFT 解决此问题的另一个问题,请发布 url,我会删除这个。

这是我目前使用的代码(有延迟):

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
}
}

最佳答案

问题是您正在主线程上检索图片,这会阻塞它。包括滚动在内的所有 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 session 来获取数据,如下所示:

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")
})

}

})

关于ios - UITableView 滚动时滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38033832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com