我有一个像这样设置的方法:
// -------------------------------------------------------------------------------
- (void)removeEventMs58:(NSManagedObject *)currentObject commit:(BOOL)commit
{
NSLog (@" ");
NSLog (@" ");
NSLog (@"PEC_ManagedObjectController remove EventMs58");
__block NSString * identEvent = [currentObject valueForKey:@"event58Identifier"];
NSLog(@"remove EventMs58 identEvent: %@", identEvent);
if ( ![identEvent length]) return;
[self performSelectorOnMainThread:@selector(setupCalendarDefaults:) withObject:nil waitUntilDone:YES];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
NSError *error = nil;
NSArray *theEvents = [eventStore calendarItemsWithExternalIdentifier:identEvent];
NSLog(@"remove EventMs58 theEvents: %@", theEvents);
for (EKEvent *anEvent in theEvents)
{
NSLog(@"remove EventMs58 before saveEvent");
if (commit) setUpCalendarCreatedOwnChange = YES;
if ([eventStore removeEvent:anEvent span:EKSpanFutureEvents commit:YES error:&error] )
{
NSLog(@"remove EventMs58 success saveEvent");
}
NSLog(@"after saveEvent error: %@",error);
NSLog(@" ");
NSLog(@" ");
}
});
}
例如,此方法可以相当快地连续调用 14 次。有 14 个不同的“identEvent”字符串。同样在调用此方法之间,类似的方法可能具有相同的代码开头,(__block NSString * identEvent) 可能会进一步混合“identEvent”字符串,这在单个线程中当然不是问题。
我的问题是,由于这个 dispatch_async 是在不同的时间和/或以后执行的,(这个方法返回很快),一个应用程序如何使用这种方法,(或一个应用程序)如何保持 identEvent 字符串是直的,所以它不会在这个使用dispatch_async 运行的不同线程中混淆identEvent 字符串?还如何确保“identEvent”不会在此过程中被释放?在执行 dispatch_async 线程之前(可能有 14 次不同的时间)?