我在处理后台线程更新时的应用程序速度存在严重问题。仪器显示几乎所有这些时间都花在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
}
内,我在那里取出需要更新的对象。
我的更新可能会有数百个,具体取决于离线时间,我目前使用的方法是单独处理它们;即获取取出对象的请求,更新,然后保存。
听起来很慢而且确实如此。我遇到的问题是我不想一次性将所有内容加载到内存中,因此需要在我们去的时候单独获取它们,同时我保存,因为我确保如果单个更新出现问题就赢了把剩下的搞得一团糟。
有更好的方法吗?
答案 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:
而不是单个对象的获取请求。
我怀疑通过收集给定实体描述的所有资源的主键,同时为所有这些资源发出一个获取请求(根据需要对这些结果进行批处理),然后处理每个更改,我可能会做得更好资源。