У меня есть приложение, которое использует UITableView внутри UIViewController, а способ формирования каждой ячейки - это информация о проблемах или сообщениях в блоге, хранятся в CoreData после их загрузки. Но когда я запустил инструмент инструментов, я узнал, что каждый раз, когда вы прокручиваете вниз или вверх, он извлекает этот CoreData. Даже если ячейка уже была инициализирована, так что это в сочетании с явно NSDate также занимает вид памяти. Программа занимает около 40 м бара и около 60% процессора при прокрутке вниз! И я искал ответы, как только инициализировать его один раз, но мог найти его где угодно. Вот это мой TableView код:TableView слишком много отстает и занимает слишком много памяти Swift
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("tableviewcell", forIndexPath: indexPath) as! BlogTableViewCell
let sortedPosts = SortPosts()
let realresults = sortedPosts.sortData()
if realresults.count > 0 {
println(cell)
let date = realresults[indexPath.row].valueForKey("date") as? NSDate
let numberOfTime = PostDateFormatter().getFormattedDate(date!)
let content = realresults[indexPath.row].valueForKey("content") as! String
let title = realresults[indexPath.row].valueForKey("title") as! String
cell.configureCell(Post(title: title.html2String, author: realresults[indexPath.row].valueForKey("author") as! String, date: numberOfTime, content: content.html2String))
tableView.hidden = false
self.view.backgroundColor = UIColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 255.0/255.0)
myIndicator.stopAnimating()
myIndicator.hidden = true
}
else {
if PostServices().isConnectedToNetwork() {
println("Error 0 results returned......")
self.tableView.reloadData()
}
}
return cell
}
и здесь SortPosts:
class SortPosts {
func sortData() -> NSArray {
var jsonin = NSArray()
let formatter = NSDateFormatter()
formatter.dateFormat = "Y-MM-dd\'T\'HH:mm:ss"
var managedObjectContext : NSManagedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!
var request = NSFetchRequest(entityName: "Post")
request.returnsObjectsAsFaults = false
let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
request.sortDescriptors = [sortDescriptor]
var results : NSArray = managedObjectContext.executeFetchRequest(request, error: nil)!
return results
}
}
А вот PostDateFormatter:
class PostDateFormatter {
func getFormattedDate(date : NSDate) -> String {
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
let dateInShortFormat = dateFormatter.stringFromDate(date)
let inter = date.timeIntervalSinceNow
var seconds = Int(abs(inter))
var minutes = seconds/60
var hours = minutes/60
var days = hours/24
var weeks = days/7
if seconds < 60 {
return "\(seconds)s"
} else if minutes < 60 {
return "\(minutes)m"
} else if hours < 24 {
return "\(hours)h"
} else if days < 7 {
return "\(days)d"
} else if weeks <= 8 {
return "\(weeks)w"
} else if weeks > 8 {
return "\(dateInShortFormat)"
}
return "Something went wrong with date formatting"
}
}
Наверное, лучше всего это сделать в 'viewDidLoad()' – pbush25
Хорошо, я сделал это в viewDidLoad(), и память проделана до 20 м о том, что процессор по-прежнему очень высок около 60%, и он все еще отстает. Может ли это иметь отношение к NSDate? – Zander
Вы тестируете устройство? игнорируйте всю статистику памяти/процессора, которую вы видите при работе на симуляторе. – MDB983