Как я могу отложить вызов метода на 1 секунду?

Есть ли простой способ задержать вызов метода в течение 1 секунды?

У меня есть UIImageView, который реагирует на событие касания. Когда обнаружено касание, некоторые анимации происходят в приложении. Через одну секунду я хочу вызвать другой метод. В этом случае я не могу использовать селектор animationDidStop.

Ответ 2

Вы также можете использовать блок

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [object method]; 
});

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

Edit:

Версия Swift 3:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    object.method()
}

Аналогично, DispatchQueue.global().asyncAfter(... также может быть хорошим вариантом.

Ответ 3

Лучший способ сделать это:

[self performSelector:@selector(YourFunctionName) 
           withObject:(can be Self or Object from other Classes) 
           afterDelay:(Time Of Delay)];

вы также можете передать nil как с параметромObject.

пример:

[self performSelector:@selector(subscribe) withObject:self afterDelay:3.0 ];

Ответ 4

Уже есть много ответов, и все они правильны. Если вы хотите использовать dispatch_after, вы должны искать фрагмент, который находится внутри Code Snippet Library в правом нижнем углу (где вы можете выбрать элементы UI).

enter image description here

Итак, вам просто нужно вызвать этот фрагмент, написав отправка в коде:

enter image description here

Ответ 5

Вы можете использовать селектор выполнения после того, как метод задержки 0,1 с вызывает этот код для этого.

[self performSelector:@selector(InsertView)  withObject:nil afterDelay:0.1]; 

Ответ 6

Вы также можете:

[UIView animateWithDuration:1.0
                 animations:^{ self.view.alpha = 1.1; /* Some fake chages */ }
                 completion:^(BOOL finished)
{
    NSLog(@"A second lapsed.");
}];

В этом случае вам нужно подделать некоторые изменения в какое-то представление, чтобы заставить анимацию работать. Это действительно хак, но я люблю блок-материал. Или заверните @mcfedr ответ ниже.


waitFor(1.0, ^
{
    NSLog(@"A second lapsed");
});

typedef void (^WaitCompletionBlock)();
void waitFor(NSTimeInterval duration, WaitCompletionBlock completion)
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC),
                   dispatch_get_main_queue(), ^
    { completion(); });
}

Ответ 7

Вы можете сделать это

[self performSelector:@selector(MethodToExecute) withObject:nil afterDelay:1.0 ];

Ответ 8

Swift 2.x

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
 dispatch_after(delayTime, dispatch_get_main_queue()) {
 print("do some work")
}

Swift 3.x - & - Swift 4

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
    print("do some work")
}

или пройти escaping closure

func delay(seconds: Double, completion: @escaping()-> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: completion)
}

Ответ 9

Существует решение Swift 3 из проверенного решения:

self.perform(#selector(self.targetMethod), with: self, afterDelay: 1.0)

И есть метод

@objc fileprivate func targetMethod(){

}

Ответ 10

Использование в Swift 3

perform(<Selector>, with: <object>, afterDelay: <Time in Seconds>)

Ответ 11

ПРИМЕЧАНИЕ: это приостановит весь поток, а не только один метод.
Сделать вызов для ожидания/ожидания/остановки за 1000 мс перед вызовом вашего метода?

Sleep(1000); // does nothing the next 1000 mSek

Methodcall(params); // now do the real thing

Изменить: вышеприведенный ответ относится к общему вопросу: "Как я могу отложить вызов метода на 1 секунду?", на который был задан вопрос во время ответа (напомните, что ответ был получен в течение 7 минут после оригинала вопрос:-)). В то время не было информации о языке, поэтому любезно прекратите судить о правильном способе использования сна я XCode и отсутствии классов...