[ios] -performSelector : withObject : afterDelay :와 같이 지연 후 블록을 어떻게 트리거합니까?

/ / performSelector:withObject:afterDelay:과 같은 인수를 사용 하는 것과 같이 지연 후 기본 매개 변수로 블록을 호출하는 방법이 있습니까?intdoublefloat



답변

찾고 계신 것 같습니다 dispatch_after(). 블록이 매개 변수를 허용하지 않아야하지만 블록이 대신 로컬 범위에서 해당 변수를 캡처하도록 할 수 있습니다.

int parameter1 = 12;
float parameter2 = 144.1;

// Delay execution of my block for 10 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    NSLog(@"parameter1: %d parameter2: %f", parameter1, parameter2);
});

더 : https://developer.apple.com/documentation/dispatch/1452876-dispatch_after


답변

dispatch_after나중에 블록을 호출하는 데 사용할 수 있습니다 . Xcode에서 입력을 시작 하고 다음과 같이 자동 완성을 dispatch_after누르십시오 Enter.

여기에 이미지 설명을 입력하십시오

다음은 “인수”로 두 개의 부동 소수점이있는 예입니다. 어떤 유형의 매크로에도 의존 할 필요가 없으며 코드의 의도는 분명합니다.

스위프트 3, 스위프트 4

let time1 = 8.23
let time2 = 3.42

// Delay 2 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    print("Sum of times: \(time1 + time2)")
}

스위프트 2

let time1 = 8.23
let time2 = 3.42

// Delay 2 seconds
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
        println("Sum of times: \(time1 + time2)")
}

목표 C

CGFloat time1 = 3.49;
CGFloat time2 = 8.13;

// Delay 2 seconds
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    CGFloat newTime = time1 + time2;
    NSLog(@"New time: %f", newTime);
});


답변

Xcode 내장 코드 스 니펫 라이브러리를 사용하는 것은 어떻습니까?

여기에 이미지 설명을 입력하십시오

스위프트 업데이트 :

많은 투표로이 답변을 업데이트 할 수있었습니다.

내장 Xcode 코드 스 니펫 라이브러리는 언어 dispatch_after전용 objective-c입니다. 사람들은에 대한 자신 만의 맞춤 코드 스 니펫 을 만들 수도 있습니다 Swift.

이것을 Xcode로 작성하십시오.

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(<#delayInSeconds#> * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {
        <#code to be executed after a specified delay#>
    })

이 코드를 끌어서 코드 스 니펫 라이브러리 영역에 놓으십시오.
여기에 이미지 설명을 입력하십시오

코드 스 니펫 목록의 맨 아래에라는 이름의 새 엔티티가 있습니다 My Code Snippet. 제목을 편집하십시오. Xcode를 입력 할 때 제안 사항을 입력하십시오 Completion Shortcut.

자세한 내용은 CustomCodeSnippet 만들기를 참조하십시오 .

스위프트 3 업데이트

이 코드를 끌어서 코드 스 니펫 라이브러리 영역에 놓으십시오.

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(<#delayInSeconds#>)) {
    <#code to be executed after a specified delay#>
}


답변

Jaime Cham의 답변을 확장하여 아래와 같이 NSObject + Blocks 범주를 만들었습니다. 이 방법이 기존 performSelector:NSObject 방법 과 더 잘 일치한다고 느꼈습니다.

NSObject + Blocks.h

#import <Foundation/Foundation.h>

@interface NSObject (Blocks)

- (void)performBlock:(void (^)())block afterDelay:(NSTimeInterval)delay;

@end

NSObject + Blocks.m

#import "NSObject+Blocks.h"

@implementation NSObject (Blocks)

- (void)performBlock:(void (^)())block
{
    block();
}

- (void)performBlock:(void (^)())block afterDelay:(NSTimeInterval)delay
{
    void (^block_)() = [block copy]; // autorelease this if you're not using ARC
    [self performSelector:@selector(performBlock:) withObject:block_ afterDelay:delay];
}

@end

다음과 같이 사용하십시오.

[anyObject performBlock:^{
    [anotherObject doYourThings:stuff];
} afterDelay:0.15];


답변

어딘가의 클래스 (예 : “Util”) 또는 Object의 Category에서 GCD를 사용하는 것보다 간단 할 수 있습니다.

+ (void)runBlock:(void (^)())block
{
    block();
}
+ (void)runAfterDelay:(CGFloat)delay block:(void (^)())block
{
    void (^block_)() = [[block copy] autorelease];
    [self performSelector:@selector(runBlock:) withObject:block_ afterDelay:delay];
}

그래서 사용하려면 :

[Util runAfterDelay:2 block:^{
    NSLog(@"two seconds later!");
}];


답변

스위프트의 경우 dispatch_after메소드를 사용하여 전역 함수를 만들었습니다. 특별한 것은 없습니다 . 읽기 쉽고 사용하기 쉽기 때문에 이것을 더 좋아합니다.

func performBlock(block:() -> Void, afterDelay delay:NSTimeInterval){
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), block)
}

다음과 같이 사용할 수 있습니다.

performBlock({ () -> Void in
    // Perform actions
}, afterDelay: 0.3)


답변

여기 내 2 센트 = 5 방법이 있습니다.)

나는 이러한 세부 사항을 캡슐화하고 AppCode가 문장을 완성하는 방법을 알려주도록합니다.

void dispatch_after_delay(float delayInSeconds, dispatch_queue_t queue, dispatch_block_t block) {
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, queue, block);
}

void dispatch_after_delay_on_main_queue(float delayInSeconds, dispatch_block_t block) {
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_after_delay(delayInSeconds, queue, block);
}

void dispatch_async_on_high_priority_queue(dispatch_block_t block) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), block);
}

void dispatch_async_on_background_queue(dispatch_block_t block) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), block);
}

void dispatch_async_on_main_queue(dispatch_block_t block) {
    dispatch_async(dispatch_get_main_queue(), block);
}