How do you return the item found by enumerateObjectsUsingBlock?
我有一个NSmutableOrderedset。
我需要枚举它,并且看起来构建在集合上的唯一选项是基于块的。所以选择最简单的基于块的选项,我有类似的东西…
1 2 3 4 5 6 | [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? } }] |
您可以使用uu块在完成块内指定一些值。
1 2 3 4 5 6 7 8 9 | __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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | - (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); } } }]; } |
您还可以使用委托,并调用已定义的委托以返回对象。
1 | [self.delegate enumerationResultObject:obj]; |
更新:
实现的EnumerateObjectsSusingBlock:实际上是同步调用的,因此更好的方法是使用
在这种情况下,最简单的方法是不使用
1 2 3 4 5 6 | for (SomeClass *obj in anNSMutableOrderedSet) { if ([obj isWhatIWant]) { yourVariable = obj; break; } } |
用
1 2 3 4 5 6 7 8 9 10 | __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 |