TableView滞后太多,占用太多内存Swift

时间:2015-07-06 13:38:47

标签: ios swift uitableview core-data

我有一个在UIViewController中使用UITableView的应用程序,每个单元格形成的方式是,有关问题或博客帖子的信息在下载后存储在CoreData中。但是当我运行仪器工具时,我发现每次向下或向上滚动它都会获取CoreData。即使单元格已经初始化,因此结合显然NSDate也会占用内存。向下滚动时,该程序占用大约40m的RAM和大约60%的CPU!我已经找到了如何只初始化一次但可以在任何地方找到它的答案。这是我的TableView代码:

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

}

3 个答案:

答案 0 :(得分:3)

您确实意识到您正在呼叫的每个小区;

   let sortedPosts = SortPosts()
   let realresults = sortedPosts.sortData() 

在tableView之外初始化所有数据会更有意义,或者肯定在除了cellForRowAtIndexPath以外的某些时候。

在其他地方构建数组或项目词典,然后在cellForRowAtIndexPath中引用数组中的项目。这样,您只需访问一次核心数据。

答案 1 :(得分:0)

您在问题中所说的内容准确描述了TableViews的工作原理。每个单元格只有在屏幕上可见时才会出列。否则,内存中没有其他单元格,并且当显示新单元格时,它们必须出列,因此无论何时显示它们都需要命中数据库和CPU以获取信息和绘图。

答案 2 :(得分:0)

如果你接受了我建议使用的挑战:asyncdisplaykit。

我相信这会有助于你的记忆问题。 它最初是为了使Facebook的论文成为可能而建立的。

http://asyncdisplaykit.org/