Есть ли способ вызвать блок с параметром примитива после задержки, например, performSelector:withObject:afterDelay:
с использованием аргумента типа int
/ double
/ float
?
734
Есть ли способ вызвать блок с параметром примитива после задержки, например, performSelector:withObject:afterDelay:
с использованием аргумента типа int
/ double
/ float
?
Ответы:
Я думаю, что вы ищете
dispatch_after()
. Это требует, чтобы ваш блок не принимал никаких параметров, но вы можете просто позволить блоку захватывать эти переменные из локальной области видимости.Подробнее: https://developer.apple.com/documentation/dispatch/1452876-dispatch_after
источник
dispatch_time(DISPATCH_TIME_NOW, 10ull * NSEC_PER_SEC)
фрагмент неприятен. Нет ли более чистого пути для этого?dispatch_get_current_queue()
всегда возвращает очередь, из которой выполняется код. Поэтому, когда этот код запускается из основного потока, блок также будет выполняться в основном потоке.dispatch_get_current_queue()
устарела сейчасВы можете использовать
dispatch_after
для вызова блока позже. В XCode начните печататьdispatch_after
и нажмите,Enter
чтобы автозаполнить к следующему:Вот пример с двумя числами в качестве аргументов. Вам не нужно полагаться на какой-либо тип макроса, и цель кода совершенно ясна:
Свифт 3, Свифт 4
Swift 2
Цель С
источник
NSEC_PER_SEC * 0.5
будет работать так же, какNSEC_PER_MSEC * 500
. Хотя вы правильно заметили, чтоdispatch_time
ожидает 64-разрядное целое число, ожидаемое значение составляет наносекунды.NSEC_PER_SEC
определяется как1000000000ull
, и умножение этого на константу с плавающей точкой0.5
будет неявно выполнять арифметику с плавающей точкой, давая500000000.0
, прежде чем она будет явно приведена обратно к 64-битному целому числу. Так что вполне приемлемо использовать долюNSEC_PER_SEC
.Как насчет использования встроенной библиотеки фрагментов кода Xcode?
Обновление для Swift:
Много голосов подтолкнуло меня к обновлению этого ответа.
Встроенная библиотека фрагментов кода Xcode имеет
dispatch_after
толькоobjective-c
язык. Люди могут также создать свой собственный фрагмент кода дляSwift
.Напишите это в Xcode.
Перетащите этот код и поместите его в область библиотеки фрагментов кода.
Внизу списка фрагментов кода появится новая сущность с именем
My Code Snippet
. Отредактируйте это для заголовка. Для предложения при вводе в Xcode заполнитеCompletion Shortcut
.Для получения дополнительной информации см. СозданиеaCustomCodeSnippet .
Обновление Swift 3
Перетащите этот код и поместите его в область библиотеки фрагментов кода.
источник
Расширяя ответ Хайме Чама, я создал категорию NSObject + Blocks, как показано ниже. Я чувствовал, что эти методы лучше соответствуют существующим
performSelector:
методам NSObjectNSObject + Blocks.h
NSObject + Blocks.m
и использовать так:
источник
delay
Должно бытьNSTimeInterval
(что являетсяdouble
).#import <UIKit/UIKit.h>
не нужен И я не понимаю, почему это- (void)performBlock:(void (^)())block;
может быть полезно, поэтому можно удалить из заголовка.Возможно, проще, чем пройти через GCD, где-нибудь в классе (например, «Util») или в Category on Object:
Итак, использовать:
источник
Для Swift я создал глобальную функцию, ничего особенного, используя
dispatch_after
метод. Мне это нравится больше, так как он читается и прост в использовании:Который вы можете использовать следующим образом:
источник
after
. Тогда вы можете написать:after(2.0){ print("do somthing") }
Вот мои 2 цента = 5 методов;)
Мне нравится инкапсулировать эти детали, и AppCode говорит мне, как закончить мои предложения.
источник
PerformSelector: WithObject всегда принимает объект, поэтому для передачи таких аргументов, как int / double / float и т. Д. ..... Вы можете использовать что-то вроде этого.
// NSNumber - это объект ..
Таким же образом вы можете использовать [NSNumber numberWithInt:] и т. Д .... и в методе получения вы можете преобразовать число в свой формат как [число int] или [число двойное].
источник
Функция dispatch_after отправляет объект блока в очередь отправки по истечении заданного периода времени. Используйте приведенный ниже код для выполнения некоторых связанных с пользовательским интерфейсом тактов через 2,0 секунды.
В Swift 3.0:
источник
mainQueue,
вместоmainQueue)
Вот Swift 3 способ поставить работу в очередь после задержки.
источник
Вот полезный помощник для предотвращения повторного многократного вызова GCD :
Теперь вы просто задерживаете свой код в главном потоке следующим образом:
Если вы хотите отложить ваш код в другой поток :
Если вы предпочитаете Framework, в котором также есть несколько удобных функций, обратитесь к HandySwift . Вы можете добавить его в свой проект через Carthage, а затем использовать его точно так же, как в примерах выше:
источник
Есть хороший пример в структуре BlocksKit.
BlocksKit
(и класс)
BBlocksKit.m
источник
В быстром 3, мы можем просто использовать функцию DispatchQueue.main.asyncAfter для запуска любой функции или действия после задержки «n» секунд. Здесь в коде мы установили задержку через 1 секунду. Вы вызываете любую функцию внутри тела этой функции, которая сработает после задержки в 1 секунду.
источник
Xcode 10.2 и Swift 5 и выше
источник
Вы можете либо обернуть аргумент в своем собственном классе, либо обернуть вызов метода в метод, который не нужно передавать в примитивном типе. Затем вызовите этот метод после вашей задержки, и в пределах этого метода выполните селектор, который вы хотите выполнить.
источник
Вот как вы можете запустить блок после задержки в Swift:
Он включен в качестве стандартной функции в моем репо .
источник
Swift 3 & Xcode 8.3.2
Этот код поможет вам, я тоже добавлю объяснение
источник
Я полагаю, что автор не спрашивает, как ждать дробное время (задержка), но вместо этого, как передать скаляр в качестве аргумента селектора (withObject :), и самый быстрый путь в современной цели C:
ваш селектор должен изменить свой параметр на NSNumber и получить значение с помощью селектора, такого как floatValue или doubleValue
источник