如何返回enumerateObjectsUsingBlock找到的项目?

时间:2016-03-30 11:01:27

标签: ios objective-c objective-c-blocks

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

4 个答案:

答案 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