it-swarm.com.ru

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

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

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

162
Thanks
performSelector:withObject:afterDelay:

Ссылка на документ

253
Jim

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

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(... также может быть хорошим вариантом.

191
mcfedr

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

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

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

пример :

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

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

enter image description here

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

enter image description here

24
Alex Cio

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

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

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

[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(); });
}
9
Geri

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

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

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)
}
4
Salman Ghumsani

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

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

И есть метод

@objc fileprivate func targetMethod(){

}
1
Kevin ABRIOUX

Используйте в Swift 3

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