2013-10-12 4 views
1

Я добавляю событие в календарь одним нажатием кнопки. Всякий раз, когда я нажимаю на эту кнопку, Xcode дает мне предупреждение и висит приложение в течение нескольких секунд, а затем добавляет событие в календарь. предупреждение следующее:UiKit следует вызывать только из основного потока сообщений

void _WebThreadLockFromAnyThread (bool), 0x175bd5c0: Получение веб-блокировки из потока, отличной от основной нити или веб-потока. UIKit не следует вызывать из вторичного потока.

код, который я использую для добавления события выглядит следующим образом:

- (IBAction)btn_reminder_click:(id)sender{ 

    [self addEventTocalendar]; 
} 

- (void)addEventTocalendar{ 
    EKEventStore *store = [[EKEventStore alloc] init]; 
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
     if (!granted) { return; } 
     EKEvent *event = [EKEvent eventWithEventStore:store]; 
     if (btn_appointment.isSelected) { 
      event.title = @"Appointment Reminder."; 
     } 
     else if (btn_pickup.isSelected){ 
      event.title = @"Pickup Reminder"; 
     } 

     event.startDate = self.selectedDate; 
     event.endDate = [event.startDate dateByAddingTimeInterval:60*60];//set 1 hour meeting 
     event.notes = txt_notes.text; 
     event.recurrenceRules = EKRecurrenceFrequencyDaily; 
     [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -5.0f]]; 
     if (selectedIndex == 1) { 
      [event addRecurrenceRule:[[EKRecurrenceRule alloc]initRecurrenceWithFrequency:EKRecurrenceFrequencyDaily interval:1 end:Nil]]; 

     } 
     else if (selectedIndex == 2){ 
      [event addRecurrenceRule:[[EKRecurrenceRule alloc]initRecurrenceWithFrequency:EKRecurrenceFrequencyWeekly interval:1 end:Nil]]; 
     } 
     else if (selectedIndex == 3){ 
      [event addRecurrenceRule:[[EKRecurrenceRule alloc]initRecurrenceWithFrequency:EKRecurrenceFrequencyMonthly interval:1 end:Nil]]; 
     } 
     else if (selectedIndex == 4){ 
      [event addRecurrenceRule:[[EKRecurrenceRule alloc]initRecurrenceWithFrequency:EKRecurrenceFrequencyYearly interval:1 end:Nil]]; 
     } 
     [event setCalendar:[store defaultCalendarForNewEvents]]; 
     NSError *err = nil; 
     [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 
     NSString *savedEventId = event.eventIdentifier; //this is so you can access this event later 
     BOOL isSuceess=[store saveEvent:event span:EKSpanThisEvent error:&err]; 

     if(isSuceess){ 
      UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Event" message:@"Event added in calendar" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alertview show]; 

     } 
     else{ 
      UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Event" message:[err description] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alertview show]; 

     } 
    }]; 

} 

кулачок Кто-нибудь помогите мне о этом, как я не в состоянии решить эту проблему.

ответ

7

Ваш UIAlertView должен отображаться на основном потоке. Попробуйте следующее:

if(isSuceess){ 
    UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Event" message:@"Event added in calendar" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [alertview show]; 
    }); 
} 
else { 
    UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Event" message:[err description] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [alertview show]; 
    }); 
} 
+0

Да, спасибо! проблема решена. – Shikhar

Смежные вопросы