2014-12-09 2 views
1

내 앱에 사소한 문제점이 하나 있습니다.블록이 내 애플리케이션을 고정합니다.

내 블록을 사용할 때 응용 프로그램이 오래 동안 (거의 1 분) 멈추고 아무것도 할 수 없으므로 모든 스크롤/단추/등이 작동하지 않습니다.

나는 더 빨리 작동하도록, 내 코드를 최적화하려면, 사용자는 일분

- (IBAction)exporter:(id)sender { 
EKEventStore *store = [[EKEventStore alloc] init]; 
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
    if (!granted) { 
     UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Accès aux calendrier" message:@"L'accès au calendrier est nécessaire pour utiliser cette fonctionnalité" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
     [alert show]; 
    } 


    EKEvent *event = [EKEvent eventWithEventStore:store]; 

    Variables *objStatutCompte = [Variables getStatutCompte]; 

    if([objStatutCompte.statutCompte isEqualToString:@"clt"]) 
    { 
     NSString* titreEvent = [NSString stringWithFormat:@"Intervention avec %@", intervenantRecup]; 
     event.title=titreEvent; 

    } 
    else if([objStatutCompte.statutCompte isEqualToString:@"slr"]) 
    { 
     NSString* titreEvent = [NSString stringWithFormat:@"Intervention chez %@", clientRecup]; 
     event.title=titreEvent; 
    } 

    NSString* lieuEvent = [NSString stringWithFormat:@"%@, %@", adresseClientRecup, villeRecup]; 


    event.location=lieuEvent; 

    NSString* currentDay = [dateRecup substringWithRange:NSMakeRange(0,2)]; 
    NSInteger jourCourant = [currentDay integerValue]; 

    NSString* currentMonth = [dateRecup substringWithRange:NSMakeRange(3,2)]; 
    NSInteger moisCourant = [currentMonth integerValue]; 

    NSString* currentYear = [dateRecup substringWithRange:NSMakeRange(6,4)]; 
    NSInteger anneeCourante = [currentYear integerValue]; 

    NSString* dateDebut = [NSString stringWithFormat:@"%d-%d-%02d %@:00", anneeCourante, moisCourant, jourCourant, heureDebutRecup]; 
    NSString* dateFin = [NSString stringWithFormat:@"%d-%d-%02d %@:00", anneeCourante, moisCourant, jourCourant, heureFinRecup]; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    [dateFormatter setTimeZone:nil]; 
    NSDate* dateD = [dateFormatter dateFromString:dateDebut]; 

    NSDate* dateF = [dateFormatter dateFromString:dateFin]; 

    event.startDate=dateD; 
    event.endDate=dateF; 

    NSMutableArray *myAlarmsArray = [[NSMutableArray alloc] init]; 
    EKAlarm *alarm1 = [EKAlarm alarmWithRelativeOffset:-3600]; // 1 Hour 
    [myAlarmsArray addObject:alarm1]; 

    event.alarms=myAlarmsArray; 

    [event setCalendar:[store defaultCalendarForNewEvents]]; 
    NSError *err = nil; 
    [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Evénement ajouté" 
                message:@"L'évenement a bien été ajouté" 
                delegate:self 
              cancelButtonTitle:@"Ok" 
              otherButtonTitles:nil, nil]; 
    [alert show]; 

}]; 

}

+0

는이 대기 라인 왜 이렇게 오래 당신이 발견 했습니까? – user623396

+0

@ user623396, 아니요. 디버깅 도구를 사용하는 방법을 모르겠습니다. – Batman

답변

3

워드 프로세서는 말한다 ... 메인 스레드에서 발생합니다

사용자가 부여하거나 액세스를 거부 탭

는 완료 핸들러는 임의의 큐에 호출됩니다. 사용자가 권한을 부여하거나 거부하기로 결정하는 동안 앱이 차단되지 않습니다.

이 키는 주 대기열에서 completionHandler이 호출되지 않을 수도 있지만 모든 UI 업데이트는 주 스레드에서 수행되어야합니다.

따라서 메인 큐에 UI 코드를 파견해야

[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // your code here 
    }); 
}]; 
+0

고마워 잘 작동합니다 :) – Batman

0

1) 사용자 악기 -> 시간 프로파일 러 도구를 기다릴 필요가 없습니다 앱의 문제 부분을 감지하려면 Xcode 메뉴에서 빌드 -> 프로파일을 선택한 다음 Time Profiler 도구를 선택한 다음 기록을 시작하십시오. 평소와 같이 앱을 사용하고 기록을 중지합니다. 오른쪽 하단에서 이러한 설정을 확인해야합니다. "전화 걸기 트리", "누락 된 기호 숨기기". 그런 다음 어떤 기능이 CPU 시간의 대부분을 사용하는지 찾으십시오.

2) 일부 프레임 워크 (예 : SDWebImage)를 사용하고 조작을위한 일부 스레드를 차단하면이 스레드에서 어떤 것을 실행하려고 시도 할 수 있습니다. . 또한이 수는 requestAccessToEntityType에 대한

+1

제쳐두고, CPU 사용량을 찾는 것이 아니라 Instruments의 "레코드 대기 스레드"기능을 제안 할 수 있습니다. 때로는 CPU 사용으로 명시되지 않는 차단 기능과 차단 된 통화와 관련없는 합법적 인 CPU 사용이있을 수 있습니다. 나는 "레코드 대기 스레드"가 문제의 핵심에 더 빨리 도달 할 것으로 생각합니다. 개인적으로 문제는 백그라운드 대기열에서 호출 UI 메서드에 달려 있다고 생각하지만, 그렇지 않으면 "대기중인 스레드 기록"이 유용합니다. – Rob