我有一个NSMutableOrderedSet。
我需要枚举它,看起来构建到集合上的唯一选项是基于块的。因此,选择最简单的基于块的选项,我有类似的东西......
[anNSMutableOrderedSet enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([(SomeClass*)obj isWhatIWant]) {
*stop = YES;
// Ok, found what I'm looking for, but how do I get it out to the rest of the code?
}
}]
答案 0 :(得分:4)
您可以使用__block在完成块内分配一些值。
__block yourClass *yourVariable;
[anNSMutableOrderedSet enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([(SomeClass*)obj isWhatYouWant]) {
yourVariable = obj;
*stop = YES;
}
}]
NSLog(@"Your variable value : %@",yourVariable);
答案 1 :(得分:2)
您需要传入一个回调/代码块来呼叫。
- (void)someMethod
{
[self enumerateWithCompletion:^(NSObject *aObject) {
// Do something with result
}];
}
- (void)enumerateWithCompletion:(void (^)(NSObject *aObject))completion
{
[anNSMutableOrderedSet enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([(SomeClass*)obj isWhatIWant]) {
*stop = YES;
if (completion) {
completion(obj);
}
}
}];
}
您也可以使用委托,并回调您已定义的委托以返回该对象。
[self.delegate enumerationResultObject:obj];
<强>更新强>
已实现的enumerateObjectsUsingBlock:实际上是同步调用的,因此更好的方法是使用__block
变量。回调仍然有效,但可能会被误解为误导。
答案 2 :(得分:1)
在这种情况下,最简单的方法是不使用enumerateObjectsUsingBlock:
,而只使用快速枚举:
for (SomeClass *obj in anNSMutableOrderedSet) {
if ([obj isWhatIWant]) {
yourVariable = obj;
break;
}
}
答案 3 :(得分:-1)
尝试使用Weak Self
__weak SomeClass *weakSelf = self;
[anNSMutableOrderedSet enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([(SomeClass*)obj isWhatIWant]) {
weakSelf = (SomeClass*)obj;
*stop = YES;
// Ok, found what I'm looking for, but how do I get it out to the rest of the code?
}
}];
//you Have to use weakSelf outside the block