你如何 return enumerateObjectsUsingBlock 找到的项目?

How do you return the item found by enumerateObjectsUsingBlock?

我有一个 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?        
    }
}]

您需要传入一个 back/block 代码调用。

- (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);
        }
    }
}];
}

您也可以使用委派,并回调您为 return 对象定义的委托。

[self.delegate enumerationResultObject:obj];

更新:

实现的 enumerateObjectsUsingBlock: 实际上是同步调用的,所以更好的方法是使用 __block 变量。回调仍然有效,但可能被解释为误导。

您可以使用 __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);

尝试 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

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

for (SomeClass *obj in anNSMutableOrderedSet) {
    if ([obj isWhatIWant]) {
        yourVariable = obj;
        break;
    }
}