Ставьте в очередь селектор к циклу выполнения - [NSObject performSelector:withObject:afterDelay:] способ пойти?

Это зависит от контекста:

  1. то, Когда самостоятельно, или присваивающий переменной, [] создает массивы, и {}, создает хеши. например,

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. [] может быть переопределен как пользовательский метод и обычно используется для выборки вещей от хешей (стандартная библиотека настраивает [] как метод на хешах, который совпадает с fetch)
    существует также соглашение, что это используется в качестве метода класса таким же образом, Вы могли бы использовать static Create метод в C# или Java. например,

    a = {1 => 2} # create a hash for example
    puts a[1] # same as a.fetch(1), will print 2
    
    Hash[1,2,3,4] # this is a custom class method which creates a new hash
    

    См. документы Хеша Ruby для того последнего примера.

  3. Это - вероятно, самое хитрое - {}, также синтаксис для блоков, но только, когда передано методу ВНЕ аргументов parens.

    , Когда Вы вызываете методы без parens, взгляды Ruby на то, куда Вы помещаете запятые для выяснения, где аргументы заканчиваются (тому, где parens был бы, ввели Вас их)

    1.upto(2) { puts 'hello' } # it's a block
    1.upto 2 { puts 'hello' } # syntax error, ruby can't figure out where the function args end
    1.upto 2, { puts 'hello' } # the comma means "argument", so ruby sees it as a hash - this won't work because puts 'hello' isn't a valid hash
    

9
задан MrMage 14 November 2009 в 16:14
поделиться

4 ответа

Какао управляется событиями. Вы не «ставите селектор в очередь в текущем цикле выполнения». Проще говоря: событие, отправленное в приложение (ввод пользователя, таймер, сетевая активность ...), вызывает запуск цикла выполнения, что приводит к тому, что что-то происходит в этом запуске цикла. Конечно, есть "подробности", но это самое основное поведение.

Если вы хотите отложить выполнение какого-либо селектора до конца текущего цикла выполнения, вызовите его последним или попросите запустить его на ( совсем рядом) предстоящий пробег петли. Методы -performSelector: ... - правильный способ сделать это. Они создают таймер, который приводит к событию, которое вызывает определенные события.

Для получения дополнительной информации см. Руководство по обработке событий какао .

6
ответ дан 4 December 2019 в 13:03
поделиться

Я не вижу ничего неэлегантного в -performSelector: withObject: afterDelay: метод, который вы выделяете. Этот метод просто ставит задачу, которая должна быть выполнена после завершения текущего цикла цикла выполнения. Из документации в разделе, который вы связали с :

Выполняет указанный селектор на текущий поток во время следующего запуска цикл цикла и после необязательной задержки период. Потому что он ждет, пока следующий цикл цикла выполнения для выполнения селектор, эти методы предоставляют автоматическая мини-задержка от в настоящее время выполняется код. Множественный поставленные в очередь селекторы выполняются одним за другим в том порядке, в котором они были поставлен в очередь.

Объект NSTimer не создается для управления этим, селектор просто ставится в очередь для запуска после определенной задержки (небольшая задержка означает сразу после завершения цикла цикла выполнения). Для действий, которые вы хотите выполнить после обновления пользовательского интерфейса, это самый простой метод.

Для более явной организации потоковой очереди вы можете посмотреть NSOperations и NSOperationQueues . NSOperationQueue с maxConcurrentOperationCount, равным 1, может выполнять операции по порядку, одну за другой.

4
ответ дан 4 December 2019 в 13:03
поделиться

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

performSelectorOnMainThread:

2
ответ дан 4 December 2019 в 13:03
поделиться

Я предпочитаю метод NSRunLoop "performSelector: target: argument: order: Mode:". Гарантируется, что селектор не будет выполняться до следующей итерации цикла выполнения, и вам не придется возиться с указанием произвольных задержек и т. Д.

4
ответ дан 4 December 2019 в 13:03
поделиться