我试图做一个ios日历本地或在Gmail(日历选择用户,我在下面的描述answer)使用objective-c事件巨大的负荷。加载散装事件得到错误
添加一个事件与我下面提到的功能对我来说工作正常,但是当我不得不做大量的例如527事件(因为我试图添加学生的学校日历)它不起作用正确。
当做大量加载时,我插入了大约100个事件,然后它开始崩溃并崩溃应用程序。
的误差,它给我有以下几种:
2016年11月17日17:23:35.966 [230:11481]日历未设置:1个错误 域= EKErrorDomain代码= 1“没有选择日历。“ UserInfo = {NSLocalizedDescription =未选择日历}
2016-11-17 17:23:49.545 [230:12644]连接中断!
二○一六年十一月一十七日17:23:49.568 [230:12587]错误得到改变对象ID 由于从守护程序时间戳501092601.149441:错误 域= NSMachErrorDomain代码= 4097 “未知错误代码”
我的问题是这样的:在我的大容量加载方法或我已经完成的功能中是否有任何错误?或其他有没有其他更好的方法来完成大量的事件?
该功能可以插入事件的列表:
- (int) addCalendarEvents: (EKCalendar *) cal {
int num = 0;
for (int i=0; i < [calendario.eventos count]; i++) {
NSDictionary * nextDict = [calendario.eventos objectAtIndex:i];
Evento_DTO * evento_dto = [[Evento_DTO alloc] initWithEventos:nextDict];
BOOL res = [self addEventCalendar: evento_dto calendar: cal];
if(res){
num++;
}
}
return num;
}
这将活动添加到日历的功能如下:
-(BOOL)addEventCalendar: (Evento_DTO *) evento calendar: (EKCalendar *) cal{
__block BOOL res = NO;
if (!SYSTEM_VERSION_LESS_THAN(@"6.0")) {
// iOS 6 and later
EKEventStore *eventStore = [[EKEventStore alloc] init];
//We get the dates of the event
Fecha_DTO *fechaStart = [[Fecha_DTO alloc] initWithFecha:(NSDictionary *)evento.dtStart];
Fecha_DTO *fechaEnd = [[Fecha_DTO alloc] initWithFecha:(NSDictionary *)evento.dtEnd];
// Format the dates to type NSDate
// Start Date
NSDateFormatter* df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyyMMdd'T'HHmmss"];
if (fechaStart.tzid == nil) {
[df setTimeZone: [NSTimeZone systemTimeZone]];
}else{
[df setTimeZone:[NSTimeZone timeZoneWithName:fechaStart.tzid]];
}
NSDate* parsedDateS = [df dateFromString: fechaStart.fecha];
// End Date
NSDateFormatter* df2 = [[NSDateFormatter alloc] init];
[df2 setDateFormat:@"yyyyMMdd'T'HHmmss"];
if (fechaEnd.tzid == nil) {
[df2 setTimeZone: [NSTimeZone systemTimeZone]];
}else{
[df2 setTimeZone:[NSTimeZone timeZoneWithName:fechaEnd.tzid]];
}
NSDate* parsedDateE = [df2 dateFromString: fechaEnd.fecha];
//rRules
NSString *rfc2445String = evento.rRule; // Usando la libreria EKRecurrenceRule+RRULE.m
EKRecurrenceRule *recurrenceRule;
if (![rfc2445String isEqualToString:@""]) {
recurrenceRule = [[EKRecurrenceRule alloc] initWithString:rfc2445String andTimezone:fechaStart.tzid];
// NSLog(@"RRule: %@", recurrenceRule);
}
if(parsedDateS!=nil){
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (granted) {
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.title = evento.summary;
event.notes = evento.description;
event.startDate = parsedDateS;
event.endDate = parsedDateE;
event.location = evento.location;
if (![rfc2445String isEqualToString:@""])
event.recurrenceRules = [NSArray arrayWithObject:recurrenceRule];
event.calendar = [eventStore calendarWithIdentifier: cal.calendarIdentifier];
//[event setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err = nil;
BOOL success = [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
if(!success){
if (err) {
NSLog(@"Calendar was not set: %li %@", (long)err.code, err.description);
}
}else{
//NSLog(@"Added Event");
res = YES;
}
} else {
// code here for when the user does NOT allow your app to access the calendar
alerta = [[UIAlertView alloc]initWithTitle:AMLocalizedString(@"Error", @"")
message:AMLocalizedString(@"errorPermisosCal", @"")
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alerta show];
}
}];
}else{
NSLog(@"The start date is null");
}
df = nil;
df2 = nil;
}else{
alerta = [[UIAlertView alloc]initWithTitle:AMLocalizedString(@"Error", @"")
message:AMLocalizedString(@"VersionEvento", @"")
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alerta show];
}
return res;
}
我们最近在大型事件集中发现了这种现象 - 有3个事件没有eventIdentifiers。这对我们的代码造成了一个问题,但是我们通过检查零并理解对应用程序的影响来解决问题。 –
@AndyWeinstein我终于可以做到大规模无大错,看看我的答案 – Joacer