使用 NSObject 确定挂起的操作

Determining pending operations with NSObject

我正在显示一个 UIView,其中包含一个按钮,让用户可以选择撤消某些操作。视图保持可见几秒钟,然后关闭。我正在创建如下视图:

[self performSelector:@selector(endUndoOption) withObject:self afterDelay:delay];

然后在必要时使用以下方法取消它:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(endUndoOption) object:self];

有什么方法可以确定是否有预定的操作(在本例中为 endUndoOption)?或者如果计时器已经开始?目前我正在使用 BOOL 标志执行此操作,但想知道是否有一种方法可以检查是否有一个排队?谢谢!

如果你勾选Cocoa Pods (http://cocoapods.org) BlocksKit pod, http://zwaldowski.github.io/BlocksKit/,NSObject上有一个特殊的类别,有两个非常有用的方法:

+ (id)bk_performBlock:(void (^)(void))block afterDelay:(NSTimeInterval)delay;

其中returns一个id是取消句柄。

+ (void)bk_cancelBlock:(id)handle;

取消预定的演出。

因此,为了实现您的目标,您可以将取消句柄存储在某些 属性 中,例如

self.endUndoCancellationHandle = [[self class] bk_performBlock:^{ 
                                              [self endUndoOption];
                                              self.endUndoCancellationHandle = nil;
                                          } afterDelay:delay]; 

然后取消:

if (self.endUndoCancellationHandle)
{
     [[self class] bk_cancelBlock:self.endUndoCancellationHandle];
     self.endUndoCancellationHandle = nil;
}

要检查是否安排了某事,只需检查您当前是否有句柄:

if (self.endUndoCancellationHandle)
{
...
}