dispatch_after 未在 ios 上循环工作
dispatch_after is not working in loop on ios
我需要在 for 循环中延迟 1 秒,但它不起作用。我需要用动画延迟 1 秒删除 tableview 单元格,这样它就会一个一个地删除。目前,所有行都在相同的地方删除 time.For 循环已经在 dispatch_after 中持续 3 秒,因此在所有嵌套的 dispatch_after.Out 侧,for 循环 dispatch_after 正在工作。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
for(int i=array_messages.count;i>0;i--)
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[array_messages removeObjectAtIndex:0];
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[self.tableViewMessage deleteRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop];
});
}
});
使用下面的代码延迟代码执行
double delayInSeconds = 1.0;
dispatch_time_t disTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(disTime, dispatch_get_main_queue(), ^(void){
//place your code
});
如果您有任何问题,请告诉我。
试试这个我没有实际尝试过所以不确定
for(int i=array_messages.count;i>0;i--)
{
int delay = (array_messages.count - i) + 1;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[array_messages removeObjectAtIndex:0];
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[self.tableViewMessage deleteRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop];
});
}
@DJTiwari 试一试它的工作
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
dispatch_async(dispatch_get_main_queue(), ^(void){
for(int i=array_messages.count;i>0;i--)
{
[NSThread sleepForTimeInterval:1];
[array_messages removeObjectAtIndex:0];
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[self.tableViewMessage deleteRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop];
}
});
});
你不能延迟 'for loop'。如果你想延迟循环使用 NSTimer。
您的 for
循环将几乎立即遍历整个序列,这意味着您的内部 dispatch_after
调用将全部设置在同一时间,因此将在大约同一时间执行,这就是您所看到的。
在这种情况下,NSTimer
您可能会得到更好的服务。像这样:
创建一个 NSTimer
属性 以使用:
@property (strong) NSTimer* deletionTimer = nil;
将这些方法添加到您的 class:
- (void)startDeletionTimer {
[self killDeletionTimer];
self.deletionTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(deletionTimerFired:) userInfo:nil repeats:YES];
}
- (void)killDeletionTimer {
[self.deletionTimer invalidate];
self.deletionTimer = nil;
}
- (void)deletionTimerFired:(NSTimer*)timer {
NSUInteger numberOfRecords = [array_messages count];
if (!numberOfRecords) {
// None left, we're done
[self killDeleteionTimer];
return;
}
[array_messages removeObjectAtIndex:0];
[self.tableViewMessage deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:indexPath.section]] withRowAnimation:UITableViewRowAnimationTop];
}
用这个启动计时器:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self startDeletionTimer];
});
与使用延迟的内部 dispatch_after
的选项相比,这有一些优势。它将优雅地处理 array_messages
数组中的更改,因为它的计数是在每次迭代时检查的,而不是在开始时假设的。因此,例如,如果您有 30 条消息,则整个删除过程将花费 30 秒。如果在该时间段内添加了一条新消息,或者更糟的是,一条消息以某种方式被删除,您的应用程序将在最后一个 dispatch_after
触发时崩溃,因为索引 and/or 行将不存在。同样,如果用户离开视图,tableView 可能会被释放,然后你就会崩溃。
另一个优点是,如果在 slowly/painfully 显示记录被删除的那 30 秒内,用户想要继续,您可以终止计时器并立即删除所有行。
我需要在 for 循环中延迟 1 秒,但它不起作用。我需要用动画延迟 1 秒删除 tableview 单元格,这样它就会一个一个地删除。目前,所有行都在相同的地方删除 time.For 循环已经在 dispatch_after 中持续 3 秒,因此在所有嵌套的 dispatch_after.Out 侧,for 循环 dispatch_after 正在工作。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
for(int i=array_messages.count;i>0;i--)
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[array_messages removeObjectAtIndex:0];
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[self.tableViewMessage deleteRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop];
});
}
});
使用下面的代码延迟代码执行
double delayInSeconds = 1.0;
dispatch_time_t disTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(disTime, dispatch_get_main_queue(), ^(void){
//place your code
});
如果您有任何问题,请告诉我。
试试这个我没有实际尝试过所以不确定
for(int i=array_messages.count;i>0;i--)
{
int delay = (array_messages.count - i) + 1;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[array_messages removeObjectAtIndex:0];
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[self.tableViewMessage deleteRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop];
});
}
@DJTiwari 试一试它的工作
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
dispatch_async(dispatch_get_main_queue(), ^(void){
for(int i=array_messages.count;i>0;i--)
{
[NSThread sleepForTimeInterval:1];
[array_messages removeObjectAtIndex:0];
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[self.tableViewMessage deleteRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop];
}
});
});
你不能延迟 'for loop'。如果你想延迟循环使用 NSTimer。
您的 for
循环将几乎立即遍历整个序列,这意味着您的内部 dispatch_after
调用将全部设置在同一时间,因此将在大约同一时间执行,这就是您所看到的。
在这种情况下,NSTimer
您可能会得到更好的服务。像这样:
创建一个 NSTimer
属性 以使用:
@property (strong) NSTimer* deletionTimer = nil;
将这些方法添加到您的 class:
- (void)startDeletionTimer {
[self killDeletionTimer];
self.deletionTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(deletionTimerFired:) userInfo:nil repeats:YES];
}
- (void)killDeletionTimer {
[self.deletionTimer invalidate];
self.deletionTimer = nil;
}
- (void)deletionTimerFired:(NSTimer*)timer {
NSUInteger numberOfRecords = [array_messages count];
if (!numberOfRecords) {
// None left, we're done
[self killDeleteionTimer];
return;
}
[array_messages removeObjectAtIndex:0];
[self.tableViewMessage deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:indexPath.section]] withRowAnimation:UITableViewRowAnimationTop];
}
用这个启动计时器:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self startDeletionTimer];
});
与使用延迟的内部 dispatch_after
的选项相比,这有一些优势。它将优雅地处理 array_messages
数组中的更改,因为它的计数是在每次迭代时检查的,而不是在开始时假设的。因此,例如,如果您有 30 条消息,则整个删除过程将花费 30 秒。如果在该时间段内添加了一条新消息,或者更糟的是,一条消息以某种方式被删除,您的应用程序将在最后一个 dispatch_after
触发时崩溃,因为索引 and/or 行将不存在。同样,如果用户离开视图,tableView 可能会被释放,然后你就会崩溃。
另一个优点是,如果在 slowly/painfully 显示记录被删除的那 30 秒内,用户想要继续,您可以终止计时器并立即删除所有行。