关于ios:如何返回enumerateObjectsUsingBlock找到的项目?

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:实际上是同步调用的,因此更好的方法是使用__block变量。回调仍然有效,但可能被解释为误导。


在这种情况下,最简单的方法是不使用enumerateObjectsUsingBlock:,而只使用快速枚举:

1
2
3
4
5
6
for (SomeClass *obj in anNSMutableOrderedSet) {
    if ([obj isWhatIWant]) {
        yourVariable = obj;
        break;
    }
}

Weak Self试试

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