通过 CGRect Intersects Rect 过滤 ns 可变数组

Posted

技术标签:

【中文标题】通过 CGRect Intersects Rect 过滤 ns 可变数组【英文标题】:Filter nsmutable array by CGRectIntersectsRect 【发布时间】:2014-09-22 14:36:15 【问题描述】:

我想从 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 会给我一些性能提升吗?

【问题讨论】:

【参考方案1】:

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

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

不过,我不确定与循环相比的性能提升,因为比较的次数将保持不变。

【讨论】:

以上是关于通过 CGRect Intersects Rect 过滤 ns 可变数组的主要内容,如果未能解决你的问题,请参考以下文章

setNeedsDisplay() 没有调用 draw(_ rect: CGRect)

- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view

CGRect

使用 override func draw(_ rect: CGRect) 时显示奇怪的边框

UITextField - (void)drawPlaceholderInRect:(CGRect)rect 在 iOS 7 中返回不同的 CGRect 高度

如何从 cellForRowAt 调用 draw(_ rect: CGRect) 在自定义 tableview 上绘图?