Как я делаю и использую Очередь в Objective C?

Как я уже говорил в комментариях

-Как функция gettarget может получить доступ к своему брату-члену класса target? - Не может, в WordPress страница не имеет было завершено, когда вызывается [ваш шорткод]. Кроме того, в шорткод передается больше только контента внутри открытого и закрытого шорткода [start]content[/start], ни один из внешнего контента не доступен (без использования javascript)

Вы можете использовать фильтр, такой как add_filter( 'the_content', 'filter_function_name' ) a регулярное выражение /\[gettarget\]/ и то, что не является коротким кодом [gettarget], поскольку WP оставляет их, если они не являются реальными короткими кодами. И тогда, когда у вас есть полный контент в ваших руках, вы можете получить доступ к тому, что вы хотите в DOM. и т. д. и т. д.

И этот ответ казался таким же хорошим ответом, как и любой другой, поэтому ...

Примерно так:

add_filter( 'the_content', 'filter_function_name' );

function filter_function_name($content){
    //if no [gettarget] bail
    if(false === strpos($content,'[gettarget]')) return $content;


    $doc = DOMDocument::loadHTML($content);
    $xpath = new DOMXpath($doc);
    var_dump($xpath);

    //for example remove [gettarget] our not shortcode, shortcode
    $content = preg_replace('/\[gettarget\]/', '', $content);

    return $content;
}

Я когда-либо использовал Dom Document только один раз (потом я узнал о PHPQuery и больше никогда не смотрел на него). Но, таким образом, вы не удваиваете загрузку страницы, я действительно не уверен, что вы получаете от этого $doc->loadHTMLFile(

Как я уже говорил в комментариях

-Как функция gettarget может получить доступ к своему брату-члену класса target? - Не может, в WordPress страница не имеет было завершено, когда вызывается [ваш шорткод]. Кроме того, в шорткод передается больше только контента внутри открытого и закрытого шорткода [111], ни один из внешнего контента не доступен (без использования javascript)

Вы можете использовать фильтр, такой как [112] a регулярное выражение [113] и то, что не является коротким кодом [114], поскольку WP оставляет их, если они не являются реальными короткими кодами. И тогда, когда у вас есть полный контент в ваших руках, вы можете получить доступ к тому, что вы хотите в DOM. и т. д. и т. д.

И этот ответ казался таким же хорошим ответом, как и любой другой, поэтому ...

Примерно так:

[110]

Я когда-либо использовал Dom Document только один раз (потом я узнал о PHPQuery и больше никогда не смотрел на него). Но, таким образом, вы не удваиваете загрузку страницы, я действительно не уверен, что вы получаете от этого [115] изнутри WordPress. Может быть, просто файл шаблона или что-то в этом роде?

Как я уже сказал выше, я знаю, что content - это то, что WordPress собирается выложить на странице. Не говоря уже о том, что я понятия не имею, как бы вы внесли какие-либо изменения в вывод по сравнению с тем, как это было у вас. Таким образом, вы можете просто изменить содержимое и вернуть его, и оно будет изменено.

-note- Последнее, это была минута, но если я помню, если у вас есть что-то вроде шорткода [gettarget], но у вас нет шорткода для него, он просто остается в контенте. Если это правильно, то, что я сказал выше, должно быть довольно близко. Мы можем использовать это в наших интересах и сделать так, чтобы это выглядело как шорткод внутри административной области WP и в выводе (удалив его).

Я думал о том, чтобы сделать это с помощью JavaScript, но, увы, мне лень вкладывать в это столько ...

1118 В любом случае, надеюсь, это поможет.

SERVER['SCRIPT_NAME']) изнутри WordPress. Может быть, просто файл шаблона или что-то в этом роде?

Как я уже сказал выше, я знаю, что content - это то, что WordPress собирается выложить на странице. Не говоря уже о том, что я понятия не имею, как бы вы внесли какие-либо изменения в вывод по сравнению с тем, как это было у вас. Таким образом, вы можете просто изменить содержимое и вернуть его, и оно будет изменено.

-note- Последнее, это была минута, но если я помню, если у вас есть что-то вроде шорткода [gettarget], но у вас нет шорткода для него, он просто остается в контенте. Если это правильно, то, что я сказал выше, должно быть довольно близко. Мы можем использовать это в наших интересах и сделать так, чтобы это выглядело как шорткод внутри административной области WP и в выводе (удалив его).

Я думал о том, чтобы сделать это с помощью JavaScript, но, увы, мне лень вкладывать в это столько ...

1118 В любом случае, надеюсь, это поможет.

107
задан Quinn Taylor 10 July 2009 в 18:03
поделиться

8 ответов

Ben's version is a stack instead of a queue, so i tweaked it a bit:

NSMutableArray+QueueAdditions.h

@interface NSMutableArray (QueueAdditions)
- (id) dequeue;
- (void) enqueue:(id)obj;
@end

NSMutableArray+QueueAdditions.m

@implementation NSMutableArray (QueueAdditions)
// Queues are first-in-first-out, so we remove objects from the head
- (id) dequeue {
    // if ([self count] == 0) return nil; // to avoid raising exception (Quinn)
    id headObject = [self objectAtIndex:0];
    if (headObject != nil) {
        [[headObject retain] autorelease]; // so it isn't dealloc'ed on remove
        [self removeObjectAtIndex:0];
    }
    return headObject;
}

// Add to the tail of the queue (no one likes it when people cut in line!)
- (void) enqueue:(id)anObject {
    [self addObject:anObject];
    //this method automatically adds to the end of the array
}
@end

Just import the .h file wherever you want to use your new methods, and call them like you would any other NSMutableArray methods.

Good luck and Keep on Coding!

153
ответ дан 24 November 2019 в 03:38
поделиться

Там нет Реальный класс коллекций очередей, но NSMutableArray можно эффективно использовать для одной и той же вещи. Вы можете определить категорию , чтобы добавить для удобства методы pop / push, если хотите.

8
ответ дан 24 November 2019 в 03:38
поделиться

Насколько мне известно, Objective-C не предоставляет структуру данных Queue. Лучше всего создать NSMutableArray , а затем использовать [array lastObject] , [array removeLastObject] для получения элемента и [array insertObject: o atIndex: 0] ...

Если вы делаете это много, вы можете создать категорию Objective-C, чтобы расширить функциональность класса NSMutableArray . Категории позволяют динамически добавлять функции в существующие классы (даже те, для которых у вас нет источника) - вы можете создать очередь, подобную этой:

(ПРИМЕЧАНИЕ. Этот код фактически предназначен для стека, а не для очереди , См. Комментарии ниже)

@interface NSMutableArray (QueueAdditions)

- (id)pop;
- (void)push:(id)obj;

@end

@implementation NSMutableArray (QueueAdditions)

- (id)pop
{
    // nil if [self count] == 0
    id lastObject = [[[self lastObject] retain] autorelease];
    if (lastObject)
        [self removeLastObject];
    return lastObject;
}

- (void)push:(id)obj
{
     [self addObject: obj];
}

@end
29
ответ дан 24 November 2019 в 03:38
поделиться

Использовать NSMutableArray.

1
ответ дан 24 November 2019 в 03:38
поделиться

Да, используйте NSMutableArray. NSMutableArray фактически реализован как 2-3 дерева; вам обычно не нужно беспокоиться о характеристиках производительности при добавлении или удалении объектов из NSMutableArray по произвольным индексам.

7
ответ дан 24 November 2019 в 03:38
поделиться

Есть ли какая-то конкретная причина, по которой вы не можете просто использовать очередь STL? Objective C ++ - это надмножество C ++ (просто используйте .mm в качестве расширения вместо .m, чтобы использовать Objective C ++ вместо Objective C). Затем вы можете использовать STL или любой другой код C ++.

Одна из проблем использования очереди / вектора / списка STL с объектами Objective C заключается в том, что они обычно не поддерживают управление памятью с сохранением / освобождением / автоматическим освобождением. Это легко обойти с помощью класса контейнера C ++ Smart Pointer, который сохраняет свой объект Objective C при создании и освобождает его при уничтожении. В зависимости от того, что вы помещаете в очередь STL, в этом часто нет необходимости.

2
ответ дан 24 November 2019 в 03:38
поделиться

Я бы не сказал, что использование NSMutableArray обязательно лучшее решение, особенно если вы добавляете методы с категориями, из-за хрупкости, которую они могут вызвать, если имена методов столкнуться. Для быстрой и грязной очереди я бы использовал методы добавления и удаления в конце изменяемого массива. Однако, если вы планируете повторно использовать очередь или хотите, чтобы ваш код был более читабельным и очевидным, вам, вероятно, понадобится специальный класс очереди.

Какао не имеет встроенного встроенного класса, но есть другие варианты, и вам тоже не нужно писать с нуля. Для настоящей очереди, которая только добавляет и удаляет с концов, круговой буферный массив является чрезвычайно быстрой реализацией. Посмотрите CHDataStructures.framework , библиотеку / фреймворк в Objective-C, которую я я работал над. Он имеет множество реализаций очередей, а также стеки, двухсторонние очереди, отсортированные наборы и т.д. an NSMutableArray.

Одним из больших преимуществ использования собственного класса Objective-C вместо класса C ++ STL является то, что он легко интегрируется с кодом Какао и намного лучше работает с кодированием / декодированием (сериализацией). Он также отлично работает со сборкой мусора и быстрым перечислением (оба присутствуют в 10.5+, но только последнее на iPhone), и вам не нужно беспокоиться о том, что такое объект Objective-C, а что - объект C ++.

Наконец, хотя NSMutableArray лучше, чем стандартный массив C при добавлении и удалении с любого конца, он ' s также не самое быстрое решение для очереди. Для большинства приложений это удовлетворительно, но если вам нужна скорость, кольцевой буфер (или в некоторых случаях связанный список, оптимизированный для поддержания горячих строк кэша) может легко нарушить NSMutableArray.

33
ответ дан 24 November 2019 в 03:38
поделиться

re: Wolfcow - Вот исправленная реализация метода удаления из очереди Wolfcow

- (id)dequeue {
    if ([self count] == 0) {
        return nil;
    }
    id queueObject = [[[self objectAtIndex:0] retain] autorelease];
    [self removeObjectAtIndex:0];
    return queueObject;
}
5
ответ дан 24 November 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: