Когда вы реализуете быстрое перечисление, вам не нужно возвращать все элементы сразу. Конечно, все, что вы получаете, возвращая их по одному, — это быстрый синтаксис перечисления без особого выигрыша в производительности.
Вы можете возвращать один элемент каждый раз, когда вызывается countByEnumeratingWithState:objects:count
, или вы можете возвращать все элементы или даже только N элементов.
Например, допустим, у вас есть огромное дерево. Вы можете использовать переданный вам буфер стека и его длину:
NSUInteger numItemsToReturn = MIN(100, lengthOfStackBuffer);
Затем вы можете продолжить обход дерева до numItemsToReturn
или пока не дойдете до конца вашего дерева.
Внутренняя инфраструктура будет продолжать вызывать countByEnumeratingWithState:objects:count
до тех пор, пока не "увидит" нужное количество элементов.
Однако обратите внимание, что если вы вернете только часть данных, вам придется сохранить информацию в state
, чтобы вы знали, где возобновить работу в следующий раз. Вот для чего нужен extra
.
ИЗМЕНИТЬ
Видел ваш комментарий к исходному сообщению... Если вы хотите поддерживать быстрое перечисление, то это довольно просто, как упоминалось выше.
Однако, если вы просто хотите пройтись по дереву, чтобы что-то сделать, вы можете рассмотреть API перечисления. Например:
-(void)enumerateWithOptions:(MyTreeEnumerationOptions)options
usingBlock:^(id object, unsigned int level, BOOL isLeaf, BOOL *stop)block {
// In here, you can use the options to determine if you are doing
// pre/post depth first search, breadth-first, reverse, even concurrent.
// You also provide an easy way to communicate to the caller not only the
// object at this node, but the tree-depth of this node, whether it is a
// leaf, and anything else you want to communicate.
}
Затем пользователи могут вызывать:
[tree enumerateWithOptions:PreOrderDepthFirst
usingBlock:^(id object, unsigned int level, BOOL isLeaf, BOOL *stop) {
// Execute whatever code you want with this object...
// Set *stop = YES to abort the enumeration.
}];
person
Jody Hagins
schedule
06.09.2012