我得到-[__NSOrderedSetM removeObjectAtIndex:]: index 0 beyond bounds for empty ordered set
了以下代码:
- (void)moveAdapter:(SUBaseAdapter *)adapter
from:(NSMutableOrderedSet *)src
to:(NSMutableOrderedSet *)trg {
SS_ASSERT(adapter);
SS_ASSERT(src);
SS_ASSERT(trg);
dispatch_barrier_sync(self.adaptersQueue, ^{ // CONCURRENT QUEUE
if (![src containsObject:adapter]) {
NSString *message = [NSString stringWithFormat:@"moveAdapter: %@ not in src", adapter.providerName];
[[SULoggerManager sharedInstance] log:message level:SU_LOG_INTERNAL tag:TAG_INTERNAL];
return;
}
if ([trg containsObject:adapter]) {
NSString *message = [NSString stringWithFormat:@"moveAdapter: %@ already in trg", adapter.providerName];
[[SULoggerManager sharedInstance] log:message level:SU_LOG_INTERNAL tag:TAG_INTERNAL];
return;
}
[trg addObject:adapter];
[trg sortUsingDescriptors:@[self.sortDescriptor]];
[src removeObject:adapter]; //CRASH HERE
});
}
所以,我没有明确地打电话removeObjectAtIndex:
,但也许removeObject:adapter
会?
这是我不明白的:
- 我尝试添加
anObject
到一组,然后调用removedObject:anObject
了两次,没有问题。 - 我认为这可能是一个并发问题,两个不同
removeObject
的线程进入认为它位于位置 1,然后第二个线程失败,但我正在使用dispatch_barrier_sync
,并且我不会从其他任何地方的“src”中删除对象。
有什么提示吗?