你如何返回通过enumerateObjectsUsingBlock找到的项?

9 浏览
0 Comments

你如何返回通过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?        
    }
}]

admin 更改状态以发布 2023年5月23日
0
0 Comments

您需要传入一个回调/代码块进行调用。

- (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变量。回调仍然可以工作,但可能被误解为具有误导性。

0
0 Comments

可以使用 __block 在完成块内部分配一些值。 \n

__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);

0