2
- (void)syncWithCalendar
{

    NSMutableDictionary *dictionary = [util readPListData];  
    NSMutableArray *courses = [util getCourses];  
    __block NSMutableArray *lessons;   
    __block NSMutableDictionary *lesson;    
    NSString *studentID = [util getProgramDetails].studentId;  
    NSString *programName = [util getProgramDetails].programName;

    __block NSString *startDateString = @"", *endDateString = @"";

    NSDateFormatter *formatter;  
    formatter = [[NSDateFormatter alloc] init];  
    [formatter setDateFormat:@"MM/dd/yyyy HH:mm:ss"];  
    [formatter setDateFormat:@"MM/dd/yyyy"];  

    NSString *currentDateString = [NSString stringWithFormat:@"%@ 09:00:00", [formatter stringFromDate:[NSDate date]]];  
    [formatter setDateFormat:@"MM/dd/yyyy HH:mm:ss"];

    NSDate *currentDate = [formatter dateFromString:currentDateString];

    self.eventstore = [[EKEventStore alloc] init];

   [self.eventstore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)  
    {  
        if (granted) {  

            NSLog(@"calendar access granted");

            for (int i=0; i<[courses count]; i++)
            {
                lessons = [[courses objectAtIndex:i] objectForKey:@"lessons"];
                for (int j=0; j<[lessons count]; j++)
                {
                    lesson = [lessons objectAtIndex:j];
                    NSString *title = nil;
                    title = [NSString stringWithFormat:@"%@ %@-Complete %@ lesson",studentID,programName,[lesson objectForKey:@"lesson-name"]];

                    startDateString = [NSString stringWithFormat:@"%@ %@", [lesson objectForKey:@"exam-date"], @"09:00:00"];
                        endDateString = [NSString stringWithFormat:@"%@ %@", [lesson objectForKey:@"exam-date"], @"18:00:00"];

                    if (!([startDateString isEqualToString:@""] && [endDateString isEqualToString:@""]))
                    {
                        EKEvent *event = [EKEvent eventWithEventStore:self.eventstore];
                        event.title=title;
                        event.startDate = [formatter dateFromString:startDateString];
                        event.endDate = [formatter dateFromString:endDateString];

                        event.allDay = NO;

                        [event setCalendar:[self.eventstore defaultCalendarForNewEvents]];


                       NSError *err = nil;
             [self.eventstore saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
           //[self.eventstore saveEvent:event span:EKSpanThisEvent error:&err];
                            if (err) {
                                NSLog(@"event not saved .. error = %@",err);
                            } else {
                                NSLog(@"event added successfully");
                            }       
                    }
                } // lessons for loop
            } // courses for loop

        } else {
            NSLog(@"Access not granted");
        }
    }];

    [self.eventstore release];  
    [formatter release];
}

成功添加事件后,它显示:

“收到内存警告。响应 SpringBoard 的终止而终止”

应用程序终止。这发生在 iOS 7 设备中。我还没有在 iOS 6 及更低版本中检查它。如果仅保存了几个事件(30 或更少),则代码可以正常工作,但它显示保存时 80 个或更多事件的内存问题。

4

3 回答 3

6

最后我找到了我的问题的答案。我想分享我的解决方案,以便它可以帮助其他人......

我特别在 iOS 7 中遇到了崩溃,这是因为下面的行

// 错误
[self.eventstore saveEvent:event span:EKSpanThisEvent commit:YES error:&err];

保存事件的正确方法:(注意:我的情况不需要事件标识符)
//正确
[self.eventstore saveEvent:event span:EKSpanThisEvent commit:NO er​​ror:&err]; 然后使用 [self.eventstore commit:NULL]

保存所有事件后。在我的情况下,这停止了崩溃。

于 2014-01-09T11:26:57.597 回答
1

切换到 ARC 可能会解决内存问题,但大量数据仍可能会出现问题。尝试在 for 循环中使用 @autorelease 池,如示例

for (int i=0; i<[courses count]; i++)
            {
@autoreleasepool {
                lessons = [[courses objectAtIndex:i] objectForKey:@"lessons"];
                for (int j=0; j<[lessons count]; j++)
                {
                    lesson = [lessons objectAtIndex:j];
                    NSString *title = nil;
                    title = [NSString stringWithFormat:@"%@ %@-Complete %@ lesson",studentID,programName,[lesson objectForKey:@"lesson-name"]];

                    startDateString = [NSString stringWithFormat:@"%@ %@", [lesson objectForKey:@"exam-date"], @"09:00:00"];
                        endDateString = [NSString stringWithFormat:@"%@ %@", [lesson objectForKey:@"exam-date"], @"18:00:00"];

                    if (!([startDateString isEqualToString:@""] && [endDateString isEqualToString:@""]))
                    {
                        EKEvent *event = [EKEvent eventWithEventStore:self.eventstore];
                        event.title=title;
                        event.startDate = [formatter dateFromString:startDateString];
                        event.endDate = [formatter dateFromString:endDateString];

                        event.allDay = NO;

                        [event setCalendar:[self.eventstore defaultCalendarForNewEvents]];


                       NSError *err = nil;
             [self.eventstore saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
           //[self.eventstore saveEvent:event span:EKSpanThisEvent error:&err];
                            if (err) {
                                NSLog(@"event not saved .. error = %@",err);
                            } else {
                                NSLog(@"event added successfully");
                            }       
                    }
                } // lessons for loop
}//autoreleasepool
            } // courses for loop

这样每个 for 循环步骤都会释放所有自动释放对象。

于 2014-01-04T12:42:16.383 回答
0

@upendar 我也有同样的场景,但我被分成小块,IE 就像如果你有 80 个要同步的事件需要 20-20 秒并暂停 2-5 秒。它们之间。 autoreleasepool很好用,但是 Calendar 执行起来占用了太多内存。这将需要超过 100% 的时间。

我对这个问题不屑一顾。真的很有意思!!!

于 2014-06-03T12:57:43.980 回答