核心数据在后台线程上缓慢处理更新

时间:2016-03-03 00:25:22

标签: ios multithreading core-data

我在处理后台线程更新时的应用程序速度存在严重问题。仪器显示几乎所有这些时间都花在import UIKit class CreateAccountPage: UITableViewController { @IBOutlet weak var UserNameTextField: UITextField! @IBOutlet weak var PasswordTextField: UITextField! @IBOutlet weak var EmailAddressTextField: UITextField! @IBOutlet weak var ActivateButton: UIButton! @IBOutlet weak var ReturnButton: UIButton! @IBAction func PressedActivateButton(sender: UIButton) { var username = UserNameTextField.text var password = PasswordTextField.text var EmailAddress = EmailAddressTextField.text // create the alert let alert = UIAlertController(title: "Activated", message: "Your new account is now activated.", preferredStyle: UIAlertControllerStyle.Alert) // add an action (button) alert.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.Default, handler: nil)) // show the alert self.presentViewController(alert, animated: true, completion: nil) } @IBAction func ReturnButton(sender: UIButton) { } //performSegueWithIdentifier("mySegueID", sender: nil } 内,我在那里取出需要更新的对象。

我的更新可能会有数百个,具体取决于离线时间,我目前使用的方法是单独处理它们;即获取取出对象的请求,更新,然后保存。

听起来很慢而且确实如此。我遇到的问题是我不想一次性将所有内容加载到内存中,因此需要在我们去的时候单独获取它们,同时我保存,因为我确保如果单个更新出现问题就赢了把剩下的搞得一团糟。

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

假设您仅定位iOS 8+,则可以使用NSBatchUpdateRequest

These guys have a great example of it但TLDR基本上是:

示例:假设我们要将所有未读的MyObject实例更新为标记为已读:

NSBatchUpdateRequest *req = [[NSBatchUpdateRequest alloc] initWithEntityName:@"MyObject"];
req.predicate = [NSPredicate predicateWithFormat:@"read == %@", @(NO)];
req.propertiesToUpdate = @{
    @"read" : @(YES)
};
req.resultType = NSUpdatedObjectsCountResultType;
NSBatchUpdateResult *res = (NSBatchUpdateResult *)[context executeRequest:req error:nil];
NSLog(@"%@ objects updated", res.result);

请注意,上面的示例来自上述博客,我没有写过代码段。

答案 1 :(得分:0)

在插入大量对象时,我遇到了类似的慢速性能。在我的情况下,我愿意在内存中保留完整的更改并执行单个保存,因此大量的获取请求占据了我的处理时间。

通过维护内存缓存将资源的主键映射到NSManagedObjectID,我获得了显着的性能提升。这使我可以使用existingObjectWithId:error:而不是单个对象的获取请求。

我怀疑通过收集给定实体描述的所有资源的主键,同时为所有这些资源发出一个获取请求(根据需要对这些结果进行批处理),然后处理每个更改,我可能会做得更好资源。