2016-11-18 41 views
1

我试图做一个日历本地或在Gmail(日历选择用户,我在下面的描述answer)使用事件巨大的负荷加载散装事件得到错误

添加一个事件与我下面提到的功能对我来说工作正常,但是当我不得不做大量的例如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; 
} 
+0

我们最近在大型事件集中发现了这种现象 - 有3个事件没有eventIdentifiers。这对我们的代码造成了一个问题,但是我们通过检查零并理解对应用程序的影响来解决问题。 –

+0

@AndyWeinstein我终于可以做到大规模无大错,看看我的答案 – Joacer

回答

0

最后,我已经能够进行大规模的大部分事件没有失败,我修改的方法如下:

- (void) addCalendarEvents: (EKCalendar *) cal store: (EKEventStore *) eventStore { 

    if (!SYSTEM_VERSION_LESS_THAN(@"6.0")) { 
     // iOS 6 and later 

     [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 

      if (granted) { 
       //se añade cada uno de los eventos 
       for (int i=0; i < [calendario.eventos count]; i++) { 
        @autoreleasepool { 
         NSDictionary * nextDict = [calendario.eventos objectAtIndex:i]; 
         Evento_DTO * evento_dto = [[Evento_DTO alloc] initWithEventos:nextDict]; 

         [self addEventCalendar: evento_dto calendar: cal.calendarIdentifier store: eventStore]; 
        } 
       } 
      } 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{ 

     alerta = [[UIAlertView alloc]initWithTitle:AMLocalizedString(@"Error", @"") 
              message:AMLocalizedString(@"Event version", @"") 
              delegate:self 
           cancelButtonTitle:@"OK" 
           otherButtonTitles:nil, nil]; 
     [alerta show]; 
    } 
} 

这将活动添加到日历功能如下:

-(void)addEventCalendar: (Evento_DTO *) evento calendar: (NSString *) cal store: (EKEventStore *) eventStore{ 

    //Obtenemos las fechas del evento 
    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; 
    EKRecurrenceRule *recurrenceRule; 

    if (![rfc2445String isEqualToString:@""]) { 
     recurrenceRule = [[EKRecurrenceRule alloc] initWithString:rfc2445String andTimezone:fechaStart.tzid]; 
     //NSLog(@"RRule: %@", recurrenceRule); 
    } 

    if(parsedDateS!=nil){ 

     EKEvent *event = [EKEvent eventWithEventStore:eventStore]; 
     event.title  = evento.summary; 
     event.notes  = evento.description; 
     event.location = evento.location; 
     event.startDate = parsedDateS; 
     event.endDate = parsedDateE; 

     if (![rfc2445String isEqualToString:@""]) 
      event.recurrenceRules = [NSArray arrayWithObject:recurrenceRule]; 

     event.calendar = [eventStore calendarWithIdentifier: cal]; 

     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"); 
     } 
    }else{ 
     NSLog(@"The start date is null"); 
    } 

    df = nil; 
    df2 = nil; 
} 

我希望它可以帮助别人。