使用-performSelector时是否存在并发问题:withObject:afterDelay:?

don*_*ile 0 iphone multithreading

例如,我经常使用这个:

[self performSelector:@selector(doSomethingAfterDelay:) withObject:someObject afterDelay:someDelay];
Run Code Online (Sandbox Code Playgroud)

现在,让我说我称之为10次以完全相同的延迟执行,如:

[self performSelector:@selector(doSomethingAfterDelay:) withObject:someObject afterDelay:2.0];
[self performSelector:@selector(doSomethingAfterDelay:) withObject:someObject afterDelay:2.0];
[self performSelector:@selector(doSomethingAfterDelay:) withObject:someObject afterDelay:2.0];
[self performSelector:@selector(doSomethingAfterDelay:) withObject:someObject afterDelay:2.0];
[self performSelector:@selector(doSomethingAfterDelay:) withObject:someObject afterDelay:2.0];
[self performSelector:@selector(doSomethingAfterDelay:) withObject:someObject afterDelay:2.0];
[self performSelector:@selector(doSomethingAfterDelay:) withObject:someObject afterDelay:2.0];
[self performSelector:@selector(doSomethingAfterDelay:) withObject:someObject afterDelay:2.0];
[self performSelector:@selector(doSomethingAfterDelay:) withObject:someObject afterDelay:2.0];


- (void)doSomethingAfterDelay:(id)someObject {
   /*
   access an array, read stuff, write stuff, do different things that would suffer in multithreaded environments .... all operations are nonatomic!
   */
}
Run Code Online (Sandbox Code Playgroud)

做这样的事情时,我发现了很奇怪的行为.根据我的理解,这个方法安排一个计时器来触发当前线程,所以在这种情况下是主线程.但由于它不会创建新线程,实际上不应该遇到并发问题,对吧?

And*_*iih 5

简短的回答.是的 - 不应该遇到并发问题.performSelectorWithObjectAfterDelay在主线程上执行(并阻止UI).但是,在上面的示例中,我不想猜测它们将运行的顺序 - 许多调用可以在运行循环的同一圈进行调度.