0

我有一个像这样设置的方法:

// -------------------------------------------------------------------------------
- (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 次不同的时间)?

4

1 回答 1

1

具有这种方法的应用程序(或应用程序)如何保持 identEvent 字符串笔直,以便它不会在使用 dispatch_async 运行的这个不同线程中混淆 identEvent 字符串?

  • DISPATCH_QUEUE_PRIORITY_X 队列是并发队列,并且在给定队列中的任务将使用“先进先出”顺序开始执行的意义上是 FIFO。

还如何确保“identEvent”不会在此过程中被释放?在执行 dispatch_async 线程之前(可能有 14 次不同的时间)?

  • 复制块时,它首先创建对块内使用的对象变量的强引用。使用in方法时:如果通过引用访问变量,则对self进行强引用;如果您按值访问变量,则会对可以使用 _block 覆盖的变量进行强引用。
于 2014-07-09T08:23:40.123 回答