删除TableViewCell然后执行更多操作

时间:2014-12-04 14:42:51

标签: ios uitableview swift delegates

我在 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")
}

1 个答案:

答案 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仅在模型上运行,因此可以安全地在后台线程中调用它,