在不阻塞的情况下在 For 循环中添加延迟 UI
Adding Delay In A For Loop Without Blocking UI
在我的 UI 中,当点击一个按钮时,它会调用一个 for 循环来顺序执行多个任务。
// For Loop
for (int i = 1; i <= 3; i++)
{
// Perform Task[i]
}
// Results:
// Task 1
// Task 2
// Task 3
在每个任务之后,我想添加一个用户定义的延迟。例如:
// For Loop
for (int i = 1; i <= 3; i++)
{
// Perform Task[i]
// Add Delay Here
}
// Results:
//
// Task 1
// Delay 2.5 seconds
//
// Task 2
// Delay 3 seconds
//
// Task 3
// Delay 2 seconds
在 iOS 中,使用 Objective-C,有没有办法在 for 循环中添加此类延迟,请记住:
- UI 应保持响应。
- 任务必须按顺序执行。
for 循环上下文中的代码示例会很有帮助。谢谢。
使用GCDdispatch_after
。
你可以在Whosebug上搜索它的用法。
不错的文章是 here
Swift 中延迟 1.5 秒的简要示例:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(Double(NSEC_PER_SEC) * 1.5)), dispatch_get_main_queue()) {
// your code here after 1.5 delay - pay attention it will be executed on the main thread
}
和objective-c:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ {
// your code here after 1.5 delay - pay attention it will be executed on the main thread
});
这听起来像是 NSOperationQueue
的理想工作,延迟是这样实现的:
@interface DelayOperation : NSOperation
@property (NSTimeInterval) delay;
- (void)main
{
[NSThread sleepForTimeInterval:delay];
}
@end
这个解决方案行得通吗?我没有使用 dispatch_after,而是使用 dispatch_async 和 [NSThread sleepForTimeInterval] 块,这允许我在自定义队列中需要的任何地方放置延迟。
dispatch_queue_t myCustomQueue;
myCustomQueue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_async(myCustomQueue, ^ {
NSLog(@“Task1”);
});
dispatch_async(myCustomQueue, ^ {
[NSThread sleepForTimeInterval:2.5];
});
dispatch_async(myCustomQueue, ^ {
NSLog(@“Task2”);
});
dispatch_async(myCustomQueue, ^ {
[NSThread sleepForTimeInterval:3.0];
});
dispatch_async(myCustomQueue, ^ {
NSLog(@“Task3”);
});
dispatch_async(myCustomQueue, ^ {
[NSThread sleepForTimeInterval:2.0];
});
这是一个 Swift 版本:
func delay(seconds seconds: Double, after: ()->()) {
delay(seconds: seconds, queue: dispatch_get_main_queue(), after: after)
}
func delay(seconds seconds: Double, queue: dispatch_queue_t, after: ()->()) {
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC)))
dispatch_after(time, queue, after)
}
你怎么称呼它:
print("Something")
delay(seconds: 2, after: { () -> () in
print("Delayed print")
})
print("Anotherthing")
在我的 UI 中,当点击一个按钮时,它会调用一个 for 循环来顺序执行多个任务。
// For Loop
for (int i = 1; i <= 3; i++)
{
// Perform Task[i]
}
// Results:
// Task 1
// Task 2
// Task 3
在每个任务之后,我想添加一个用户定义的延迟。例如:
// For Loop
for (int i = 1; i <= 3; i++)
{
// Perform Task[i]
// Add Delay Here
}
// Results:
//
// Task 1
// Delay 2.5 seconds
//
// Task 2
// Delay 3 seconds
//
// Task 3
// Delay 2 seconds
在 iOS 中,使用 Objective-C,有没有办法在 for 循环中添加此类延迟,请记住:
- UI 应保持响应。
- 任务必须按顺序执行。
for 循环上下文中的代码示例会很有帮助。谢谢。
使用GCDdispatch_after
。
你可以在Whosebug上搜索它的用法。
不错的文章是 here
Swift 中延迟 1.5 秒的简要示例:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(Double(NSEC_PER_SEC) * 1.5)), dispatch_get_main_queue()) {
// your code here after 1.5 delay - pay attention it will be executed on the main thread
}
和objective-c:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ {
// your code here after 1.5 delay - pay attention it will be executed on the main thread
});
这听起来像是 NSOperationQueue
的理想工作,延迟是这样实现的:
@interface DelayOperation : NSOperation
@property (NSTimeInterval) delay;
- (void)main
{
[NSThread sleepForTimeInterval:delay];
}
@end
这个解决方案行得通吗?我没有使用 dispatch_after,而是使用 dispatch_async 和 [NSThread sleepForTimeInterval] 块,这允许我在自定义队列中需要的任何地方放置延迟。
dispatch_queue_t myCustomQueue;
myCustomQueue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_async(myCustomQueue, ^ {
NSLog(@“Task1”);
});
dispatch_async(myCustomQueue, ^ {
[NSThread sleepForTimeInterval:2.5];
});
dispatch_async(myCustomQueue, ^ {
NSLog(@“Task2”);
});
dispatch_async(myCustomQueue, ^ {
[NSThread sleepForTimeInterval:3.0];
});
dispatch_async(myCustomQueue, ^ {
NSLog(@“Task3”);
});
dispatch_async(myCustomQueue, ^ {
[NSThread sleepForTimeInterval:2.0];
});
这是一个 Swift 版本:
func delay(seconds seconds: Double, after: ()->()) {
delay(seconds: seconds, queue: dispatch_get_main_queue(), after: after)
}
func delay(seconds seconds: Double, queue: dispatch_queue_t, after: ()->()) {
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC)))
dispatch_after(time, queue, after)
}
你怎么称呼它:
print("Something")
delay(seconds: 2, after: { () -> () in
print("Delayed print")
})
print("Anotherthing")