/ / performSelector:withObject:afterDelay:
과 같은 인수를 사용 하는 것과 같이 지연 후 기본 매개 변수로 블록을 호출하는 방법이 있습니까?int
double
float
답변
찾고 계신 것 같습니다 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);
}