2014-09-22 7 views
1

Я хочу извлечь из массива SKSpriteNode только те элементы, которые пересекаются с предопределенным фреймом. Я могу это сделать, а при итерации:Фильтр nsmutable array от CGRectIntersectsRect

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

Однако Performace этого метода, кажется, быть бедным, есть способ сделать эту операцию в более быстрый способ? Я пытался что-то вроде этого:

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

Но это создает ошибку «Не удалось разобрать имя функции„CGRectIntersectsRect“в поддерживаемом селектор (CGRectIntersectsRect)». Что не так? Использование предиката вместо a for даст мне некоторый выигрыш в производительности?

ответ

0

Поскольку предикат синтаксический анализатор не может распознать свободностоящая функцию C, вы можете сделать предикат из блока:

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

Я не уверен, что прирост производительности в сравнении с петлей, хотя бы потому, количество сравнений останется неизменным.

Смежные вопросы