Objective c dispatch\u async,保持外部变量正确

Objective c dispatch\u async,保持外部变量正确,objective-c,concurrency,sync,dispatch-async,Objective C,Concurrency,Sync,Dispatch Async,我有一个这样设置的方法: // ------------------------------------------------------------------------------- - (void)removeEventMs58:(NSManagedObject *)currentObject commit:(BOOL)commit { NSLog (@" "); NSLog (@" "); NSLog (@"PEC_ManagedObjectController remove

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

// -------------------------------------------------------------------------------
- (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*identivent),这可能会进一步混合“identivent”字符串,这在单个线程中当然不是问题


我的问题是,由于此dispatch_async是在不同和/或更晚的时间执行的,(此方法返回速度很快),使用此方法的应用程序(或应用程序)如何保持identEvent字符串笔直,以便不会在使用dispatch_async运行的不同线程中混淆identEvent字符串?另外,它如何确保“identivent”不会在过程中被释放?(可能有14次)在执行dispatch_async线程之前?

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

  • 调度队列优先级队列是并发队列,是FIFO 在某种意义上,给定队列中的任务将开始执行 使用“先进先出”的顺序
另外,它如何确保“identivent”不会在过程中被释放?(可能是14次不同的时间)在调度之前,异步线程是否执行过


  • 复制块时,它首先创建对块的强引用 块中使用的对象变量。在方法中使用时:如果 通过引用访问变量,对self进行强引用; 如果按值访问变量,则强烈引用 可以使用_块重写的变量

关于调度异步行为及其FIFO工作方式的回答非常好,我从回答中理解了这一部分:——“因此,如果您向调度队列优先级默认值发送1000个调度异步()块,这些任务将按照您发送到队列中的顺序开始执行”--------但我的问题与不在dispatch_async内的变量有关,(我不认为该变量被持有,或者可能我错了。)当它不在dispatch_async内时,dispatch_async怎么能先入先出使用该变量?当复制块时,它首先创建对块中使用的对象变量的强引用。在方法中使用时:若通过引用访问变量,则对self进行强引用;如果按值访问变量,则会对变量进行一个强引用,该变量可以使用_block.重写,以便我理解您的意思:“identEvent”可能会更改并不重要,因为每次调用dispatch_async时,它都会生成自身的“副本”?当它复制自身时,它会带来对外部变量的单独引用?长话短说,你是说这种方法按照它的设置方式就可以很好地工作?即使它可以被连续调用14次,它只会复制14个副本和/或引用该变量,所以我不必担心它?正确;这里没有理由设置
\u块