【问题标题】:Blocks freeze my application块冻结我的应用程序
【发布时间】:2014-12-09 14:16:20
【问题描述】:

我的应用有一个小问题。

当我使用我的块时,应用程序冻结了很长时间(几乎 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];

}];

}

【问题讨论】:

  • 你有没有发现它在哪条线上等了这么久?
  • @user623396,不,我不知道如何使用调试工具。

标签: ios objective-c iphone objective-c-blocks


【解决方案1】:

requestAccessToEntityType 的文档说:

当用户点击以授予或拒绝访问时,将在任意队列上调用完成处理程序。当用户决定授予或拒绝权限时,您的应用不会被阻止。

关键是completionHandler可能不会在主队列上被调用,但所有的UI更新都必须在主线程上进行。

因此,您应该将 UI 代码分派到主队列:

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

【讨论】:

    【解决方案2】:

    1) User Instruments->Time Profiler 工具来检测应用程序的问题部分: 在 Xcode 菜单 Build->Profile 中,然后选择 Time Profiler 工具,然后开始记录。像往常一样使用应用程序,然后停止记录。在右下角,您需要检查此类设置: “反转调用树”、“隐藏缺失符号”。然后找出哪个函数占用CPU时间最多

    2) 根据我的经验,如果您使用某些框架(例如 - SDWebImage),阻止某些线程进行操作,然后您尝试在该线程中执行某些内容,则可能会发生这种情况。它也可能发生在主线程中......

    【讨论】:

    • 顺便说一句,与其寻找 CPU 使用率,我可能会建议 Instruments 的“记录等待线程”功能。有时,您可能会遇到不表现为 CPU 使用情况的阻塞,并且可能存在与阻塞调用无关的合法 CPU 使用情况。我怀疑“记录等待线程”可能会更快地触及问题的核心。我个人怀疑问题在于他从后台队列调用 UI 方法,但如果不是,“记录等待线程”很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多