你如何 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;
}
}
我有一个 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;
}
}