我在 Swift 编码。我想通过从右到左滑动删除TableViewCell
,但我想要快速,即时。
就目前而言,我执行的更多内容不仅仅是从TableView
删除元素。这是我的代码:
// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
// Delete the row from the data source
myRecomBottlesArray[0].removeFromRecomm(myRecomBottlesArray[indexPath.row])
myRecomBottlesArray.removeAtIndex(indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
如您所见,我myRecomBottlesArray.removeAtIndex(indexPath.row)
和tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
非常快。
我的问题是我也在做myRecomBottlesArray[0].removeFromRecomm(myRecomBottlesArray[indexPath.row])
从内存中加载一个表,从该表中删除该元素,然后再将表保存在内存中。
因此,当我按下Delete
按钮时,按下按钮的时刻和实际删除GUI中的行的时刻之间会有2秒的延迟。
我想知道如何首先删除GUI中的行,然后只在后台加载我的列表,删除元素并再次保存列表。通过这种方式,用户感觉它是即时的,并且可以在应用程序实际在后台完成时继续在应用程序上执行操作。
我想我应该使用代表,但我在这方面很新,我不知道该怎么做。如果需要,我可以提供更多代码。
以下是removeFromRecomm()
函数的代码:
var recomBottlesArray = NSMutableArray()
func removeFromRecomm(bottle: Bottle) {
let bottleLoaded = Bottle.loadSaved()
bottleLoaded?.recomBottlesArray.removeObject(bottle)
bottleLoaded?.save()
}
class func loadSaved() -> Bottle? {
if let data = NSUserDefaults.standardUserDefaults().objectForKey("bottleList") as? NSData {
return NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Bottle
}
return nil
}
func save() {
let data = NSKeyedArchiver.archivedDataWithRootObject(self)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "bottleList")
}
答案 0 :(得分:0)
方法removeFromRecomm
需要很长时间才能完成并阻塞主线程,这就是延迟的原因。
您可以使用Grand Central Dispatch:
在后台线程中执行此类方法dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), {
myRecomBottlesArray[0].removeFromRecomm(myRecomBottlesArray[indexPath.row])
}
myRecomBottlesArray.removeAtIndex(indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
还有其他方法可以在后台执行代码,例如NSOperation
。您可以在Concurrency Programming Guide中了解它们。请注意,UIKit不是线程安全的:UI对象上的所有操作都必须在主线程中完成。由于您的方法removeFromRecomm
仅在模型上运行,因此可以安全地在后台线程中调用它,