为什么我的表视图更新速度如此之慢?这是正常的吗?

时间:2016-02-06 09:38:01

标签: ios swift uitableview core-data

我创建了一个应用程序,用于在Core Data中存储一些播放列表。我使用表视图控制器来显示播放列表。用户还可以在表格视图中添加和删除播放列表。

删除按钮正常工作。我在导航栏的右侧添加了一个添加按钮。按下按钮时,会显示警告并询问用户是否有播放列表的名称。如果用户未输入任何内容,则另一个警报将显示错误。如果用户输入有效,则播放列表将添加到表格视图中。

以下是相关代码:

import UIKit
import CoreData

class PlaylistController: UITableViewController {
    var playlists: [Playlists] = []
    let dataContext: NSManagedObjectContext! = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext

    override func viewDidLoad() {
        if dataContext != nil {
            let entity = NSEntityDescription.entityForName("Playlist", inManagedObjectContext: dataContext)
            let request = NSFetchRequest()
            request.entity = entity
            let playlists = try? dataContext.executeFetchRequest(request)
            if playlists != nil {
                for item in playlists! {
                    self.playlists.append(item as! Playlists)
                }
            }
        }
    }

    //This will be called when the user clicks the add button
    @IBAction func addPlaylist(sender: UIBarButtonItem) {
        let alert = UIAlertController(title: "新播放列表", message: "请输入播放列表的名字", preferredStyle: .Alert)
        alert.addTextFieldWithConfigurationHandler({ (textField) -> Void in
            textField.placeholder = "名字"
        })
        alert.addAction(UIAlertAction(title: "确定", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
            if alert.textFields?.first?.text == "" || alert.textFields?.first?.text == nil {
                let failAlert = UIAlertController(title: "失败", message: "播放列表名不能为空", preferredStyle: .Alert)
                failAlert.addAction(UIAlertAction(title: "确定", style: .Default, handler: nil))
                self.presentViewController(failAlert, animated: true, completion: nil)
                return
            }
            let newPlaylist = Playlists(entity: NSEntityDescription.entityForName("Playlist", inManagedObjectContext: self.dataContext)!, insertIntoManagedObjectContext: self.dataContext)
            newPlaylist.name = alert.textFields?.first?.text
            self.playlists.append(newPlaylist)
            do {
                try self.dataContext.save()
            } catch let error as NSError {
                print(error)
            }
            self.tableView.reloadData()
        }))
        alert.addAction(UIAlertAction(title: "取消", style: UIAlertActionStyle.Cancel, handler: nil))

        self.presentViewController(alert, animated: true, completion: nil)
    }
}

当我点击添加按钮并给播放列表命名,然后单击确定(确定)时,我需要等待大约0.5~1秒才能看到新单元格显示。

造成这种情况的原因是什么?我的第一个猜测是警报的创建花了太长时间。但实际上警报很快就出现了!我认为必须与reloadData方法有关。但到底是什么?这是表格视图的正常行为吗?

2 个答案:

答案 0 :(得分:0)

也许完全重新加载tableview需要很长时间(假设数据似乎来自NSManagedObjects)。

您是否尝试使用insertRowsAtIndexPaths而不是self.tableView.reloadData()?

由于您已经将记录添加到数组中,并且您知道它应该出现在哪一行,因此无需重新加载整个tableview。

答案 1 :(得分:-1)

看起来你没有使用NSFetchedResultController。我想你的桌面数据基于播放列表。也许您可以先尝试更新表视图,然后再保存核心数据。

self.playlists.append(newPlaylist)
self.tableView.reloadData()

self.dataContext.performBlock({ () -> Void in 
    do {
        try self.dataContext.save()
    } catch let error as NSError {
        print(error)
    }
})