dispatch_async,保持外部变量正确

时间:2014-07-08 23:30:36

标签: objective-c concurrency sync dispatch-async

我有一个方法设置如下:

// -------------------------------------------------------------------------------
- (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"一路上没有解除分配? (可能是14次不同的时间)在执行dispatch_async线程之前?

1 个答案:

答案 0 :(得分:1)

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

  • DISPATCH_QUEUE_PRIORITY_X队列是并发队列,是FIFO 从某种意义上说,给定队列中的任务将开始执行 使用“先进先出”命令。

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

  • 复制块时,首先会创建对该块的强引用 块内使用的对象变量。在方法中使用时:如果 你通过引用访问变量,强烈参考自我; 如果按值访问变量,则会对该变量进行强引用 可以使用_block覆盖的变量。