2015-07-06 4 views
3

У меня есть приложение, которое использует 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" 
} 

}

ответ

3

Вы понимаете, что для каждой ячейки вы звоните;

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

было бы больше смысла INIT все данные за пределами вашего Tableview, или, конечно, в какой-то момент, кроме cellForRowAtIndexPath.

Создайте массив или словарь предметов в другом месте, а затем просто укажите элементы в массиве в cellForRowAtIndexPath. Таким образом, вы получаете доступ к основным данным один раз.

+0

Наверное, лучше всего это сделать в 'viewDidLoad()' – pbush25

+0

Хорошо, я сделал это в viewDidLoad(), и память проделана до 20 м о том, что процессор по-прежнему очень высок около 60%, и он все еще отстает. Может ли это иметь отношение к NSDate? – Zander

+0

Вы тестируете устройство? игнорируйте всю статистику памяти/процессора, которую вы видите при работе на симуляторе. – MDB983

0

Что вы» в твоем q uestion точно описывает, как работает TableViews. Каждая ячейка удаляется только тогда, когда она будет видна на экране. В противном случае в памяти нет других ячеек, и когда отображаются новые ячейки, они должны быть удалены и, таким образом, требуют попадания в базу данных и ЦП для получения информации и рисования всякий раз, когда они отображаются.

+0

Я понимаю, что, но есть способ вокруг создания баран менее overkilled. Потому что вы едва можете прокрутить вниз, он отстает, как сумасшедший. – Zander

0

Если вы готовы к вызову, я бы предложил использовать: asyncdisplaykit.

Я считаю, что это поможет вашей памяти. Первоначально он был построен, чтобы сделать бумагу Facebook возможной.

http://asyncdisplaykit.org/

Смежные вопросы