2011-04-01 3 views
2

iOS 4.3.1에서 이벤트 킷을 사용하여 지정된 시간 간격으로 모든 이벤트를 검색합니다. 그러나 다음과 같은 문제가 발생합니다.이벤트 키트를 사용하여 지정된 시간 간격으로 이벤트 가져 오기가 예상대로 작동하지 않습니다.

1) 시작일 [NSDate distantPast] 및 종료일 [NSDate distantFuture]를 사용하여 이벤트를 반환하지 않습니다.

EKEventStore *store = [[EKEventStore alloc] init]; 

    // Create the predicate. 
    NSPredicate *eventPredicate = [store predicateForEventsWithStartDate:[NSDate distantPast] endDate:[NSDate distantFuture] calendars:store.calendars]; 

    // Fetch all events that match the predicate. 
    NSArray *events = [[store eventsMatchingPredicate:eventPredicate] retain]; 

2) 10 년 ago에 시작 날짜와 10 년 종료 날짜를 설정하면 이제 반환되는 다른 2005 아무것도까지 이벤트를 가져옵니다.

EKEventStore *store = [[EKEventStore alloc] init]; 

    CFGregorianDate gregorianStartDate, gregorianEndDate; 
    CFGregorianUnits startUnits = {-10, 0, 0, 0, 0, 0}; 
    CFGregorianUnits endUnits = {10, 0, 0, 0, 0, 0}; 
    CFTimeZoneRef timeZone = CFTimeZoneCopySystem(); 

    gregorianStartDate = CFAbsoluteTimeGetGregorianDate(
                 CFAbsoluteTimeAddGregorianUnits(CFAbsoluteTimeGetCurrent(), 
                 timeZone, 
                 startUnits), 
                 timeZone); 
    gregorianStartDate.hour = 0; 
    gregorianStartDate.minute = 0; 
    gregorianStartDate.second = 0; 

    gregorianEndDate = CFAbsoluteTimeGetGregorianDate(
                 CFAbsoluteTimeAddGregorianUnits(CFAbsoluteTimeGetCurrent(), 
                 timeZone, 
                 endUnits), 
                 timeZone); 
    gregorianEndDate.hour = 0; 
    gregorianEndDate.minute = 0; 
    gregorianEndDate.second = 0; 

    NSDate* startDate = 
    [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianStartDate, timeZone)]; 
    NSDate* endDate = 
    [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianEndDate, timeZone)]; 

    CFRelease(timeZone); 

    // Create the predicate. 
    NSPredicate *eventPredicate = [store predicateForEventsWithStartDate:startDate endDate:endDate calendars:store.calendars]; 

    // Fetch all events that match the predicate. 
    NSArray *events = [[store eventsMatchingPredicate:eventPredicate] retain]; 

게시 된 코드 스 니펫이 맞는지 또는 내가 잘못하고 있는지 궁금합니다. 이상적으로 나는 [NSDate distantPast]와 [NSDate distantFuture]를 사용하여 모든 달력의 모든 이벤트를 단일 호출로 검색하고자합니다. 이것은 실제로 가능합니까? 또한 두 번째 예제가 (적어도 나를 위해) 작동하지 않기 때문에, 모든 이벤트를 검색하는 올바른 방법은 무엇입니까? 좁은 시간 간격으로 여러 번 통화해야합니까? 그렇다면 이벤트를 검색하는 데 가장 큰 시간 간격은 무엇입니까? 미리 감사드립니다.

+0

해결 했습니까? –

+0

아직 해결 했습니까? –

답변

0

AFAIK, 정확합니다. 실수가 코드의이 부분에있는 것처럼 보이지 않습니다. 두 번째 발췌 문장을 스크래치 응용 프로그램에 넣었습니다.

CFGregorianDate gregorianStartDate, gregorianEndDate; 
    CFGregorianUnits startUnits = {-10, 0, 0, 0, 0, 0}; 
    CFGregorianUnits endUnits = {10, 0, 0, 0, 0, 0}; 
    CFTimeZoneRef timeZone = CFTimeZoneCopySystem(); 

    gregorianStartDate = CFAbsoluteTimeGetGregorianDate(
                 CFAbsoluteTimeAddGregorianUnits(CFAbsoluteTimeGetCurrent(), 
                 timeZone, 
                 startUnits), 
                 timeZone); 
    gregorianStartDate.hour = 0; 
    gregorianStartDate.minute = 0; 
    gregorianStartDate.second = 0; 

    gregorianEndDate = CFAbsoluteTimeGetGregorianDate(
                 CFAbsoluteTimeAddGregorianUnits(CFAbsoluteTimeGetCurrent(), 
                 timeZone, 
                 endUnits), 
                 timeZone); 
    gregorianEndDate.hour = 0; 
    gregorianEndDate.minute = 0; 
    gregorianEndDate.second = 0; 

    NSDate* startDate = 
    [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianStartDate, timeZone)]; 
    NSDate* endDate = 
    [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianEndDate, timeZone)]; 

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init]autorelease]; 
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]autorelease]; 
[dateFormatter setLocale:usLocale]; 

NSDate * today = [[[NSDate alloc] init] autorelease]; [207 15,440] 로케일 ko 페이지에 대한 날짜 : 2011년 11월 23일

2011-11-

2011-11-23 13 : 31 40.244 TestApp가

NSLog(@"Date for locale %@: %@",[[dateFormatter locale] localeIdentifier], [dateFormatter stringFromDate:today]); 
    NSLog(@"Date for locale %@: %@",[[dateFormatter locale] localeIdentifier], [dateFormatter stringFromDate:startDate]); 
    NSLog(@"Date for locale %@: %@",[[dateFormatter locale] localeIdentifier], [dateFormatter stringFromDate:endDate]); 

    CFRelease(timeZone); 

I는 다음과 같은 출력을 가지고 23 13 : 31 : 41.195 Testapp [15440 : 207] 로캘 날짜 en_US : 2001 년 11 월 23 일

2011-11-23 13:31:42.063 Testapp [15440 : 207] 로캘 날짜 en_US : 2021 년 11 월 23 일

행운을 비네.

나는을 사용하여 향후 10 년 및 과거 10 년을 얻습니다. 위 코드에 추가,

NSDateComponents *yearForPredicate = [[[NSDateComponents alloc] init]autorelease]; 
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendar:NSGgregorianCalendar]autorelease]; 
[yearForPredicate setYear:10]; 
NSDate *distantFuture = [gregorian dateByAddingComponents:yearForPredicate toDate:today options:0]; 
[yearForPredicate setYear:-10] 
NSDate *distantPast = [gregorian dateByAddingComponents:yearForPredicate toDate:today options:0]; 
관련 문제