0
我的程序從Web服務接收JSON數據。接下來,程序使用核心數據將數據存儲在數據庫中。如果我在添加每個條目後調用保存數據,則一切正常,但非常緩慢。保持200條記錄需要一分多鐘。將數據保存在覈心數據(IOS)中時出錯
如果我在最後只執行一次保存 - 程序拋出異常。
- (void) onLoadMessages:(NSObject*)object {
NSArray *messages = (NSArray*)object;
if (messages==nil) {
[self onError:@"Message array is null"];
return;
}
NSDate *date = [NSDate date];
long now = [date timeIntervalSince1970];
Boolean update = false;
for(int i=0; i<messages.count; i++) {
NSDictionary *m = messages[i];
Message *msg = [[Message alloc]initWithDictionary:m];
if ([self UpdateMessage:msg UpdateTime:now])
update = true;
}
if (update) {
NSError *error = nil;
// Error throw here
if (![self.managedObjectContext save:&error])
[self onError2:error];
}
}
- (Boolean) UpdateMessage:(Message*) msg UpdateTime:(long)now {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Messages" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSString *s = [NSString stringWithFormat:@"%ld", msg.id];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(id=%@)", s];
[fetchRequest setPredicate:pred];
NSError *error;
NSArray *object = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
Boolean result = false;
if (object==nil)
[self onError2:error];
else {
NSManagedObject *m;
if ([object count]==0) {
// Insert new message
m = [NSEntityDescription insertNewObjectForEntityForName:@"Messages"
inManagedObjectContext:self.managedObjectContext];
[m setValue:[NSNumber numberWithLong:msg.id] forKey:@"id"];
[m setValue:[NSNumber numberWithLong:msg.agancy.id] forKey:@"agancy"];
[m setValue:msg.header forKey:@"header"];
[m setValue:msg.keywords forKey:@"keywords"];
[m setValue:[NSNumber numberWithLong:msg.indate] forKey:@"indate"];
[m setValue:[NSNumber numberWithLong:now] forKey:@"updated"];
result = true;
} else {
// Update message
m = [object objectAtIndex:0];
[m setValue:[NSNumber numberWithLong:now] forKey:@"updated"];
}
// Save the context.
// Too long execution
/*NSError *error = nil;
if (![self.managedObjectContext save:&error])
[self onError2:error];*/
}
return result;
}
幫助正確的程序的行爲。
尊重, 亞歷山大。
P.S. 執行發生在主線程中。
索引表「消息」的字段「Id」。
您有哪些異常? – Andrey
線程1:信號SIGABRT 和粉碎應用:( – alisichkin