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 在某种意义上,给定队列中的任务将开始执行 使用“先进先出”的顺序
- 复制块时,它首先创建对块的强引用 块中使用的对象变量。在方法中使用时:如果 通过引用访问变量,对self进行强引用; 如果按值访问变量,则强烈引用 可以使用_块重写的变量
\u块
。