1

我想从 SKSpriteNode 数组中仅提取与预定框架相交的元素。我可以通过 for 迭代来做到这一点:

 for (SKSpriteNode* Object in Array) {
    if (CGRectIntersectsRect(Frame,Object.frame)) {
         //extraction code
    }
 }

但是这种方法的性能似乎很差,有没有办法以更快的方式执行此操作?我尝试过这样的事情:

NSPredicate *Predicate = [NSPredicate predicateWithFormat:@"CGRectIntersectsRect(Frame,SELF.frame)"];
   NSArray *Results = [Array filteredArrayUsingPredicate:Predicate];

但这会产生错误“无法将函数名称'CGRectIntersectsRect'解析为支持的选择器(CGRectIntersectsRect)”。怎么了?使用谓词而不是 for 会给我一些性能提升吗?

4

1 回答 1

0

由于谓词解析器无法识别独立的 C 函数,因此您可以从块中创建谓词:

NSPredicate *intersects = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bindings) {
    return CGRectIntersectsRect(Frame, obj.frame);
}];
NSArray *results = [Array filteredArrayUsingPredicate:intersects];

不过,我不确定与循环相比的性能增益,因为比较的数量将保持不变。

于 2014-09-22T14:45:45.697 回答