objective-c - setNeedsLayout 如何工作?

标签 objective-c delay setter nsrunloop delayed-execution

我想知道 Apple 的 -setNeedsLayout 是如何工作的。

我已经知道它比直接调用 -layoutSubviews 更有效,因为我可能需要在一个方法中执行两次。
这正是我需要它的目的:一些自定义 -setNeedsValidation 用于 View Controller 。
但是如何实现这样的功能呢?

最佳答案

我无法确认 Apple 是否正是这样做的,但这里有一种方法可以满足您的需求,并且可能类似于 setNeedsLayout 的实现方式。我还没有对此进行测试(甚至没有对其进行编译),但它应该给出了如何将问题作为 UIViewController 上的一个类别来解决的想法。与 UIKit 一样,这是完全线程不安全的。

static NSMutableSet sViewControllersNeedingValidation = nil;
static BOOL sWillValidate = NO;

@implementation UIViewController (Validation)
+ (void)load {
  sViewControllersNeedingValidation = [[NSMutableSet alloc] init];
}

- (void)setNeedsValidation {
  [sViewControllersNeedingValidation addObject:self];

  if (! sWillValidate) {
    sWillValidate = YES;
    // Schedule for the next event loop
    [[self class] performSelector:@selector(dispatchValidation) withObject:nil afterDelay:0];
  }
}

+ (void)dispatchValidation {
  sWillValidate = NO;
  // The copy here is in case any of the validations call setNeedsValidation.
  NSSet *controllers = [sViewControllersNeedingValidation copy];
  [sViewControllersNeedingValidation removeAllObjects];
  [controllers makeObjectsPerformSelector:@selector(validate)];
  [controllers release];
}

- (void)validate {
  // Empty default implementation
}

关于objective-c - setNeedsLayout 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7794185/

相关文章:

ios - 如何在 iOS objective-c 中仅隐藏后退栏按钮项目标题

Python,与 joblib : Delayed with multiple arguments 并行化

javascript - 如何让 jQuery 代码暂停几毫秒?

javascript - 脚本需要等待元素加载

ios - 是否可以在不删除整个项目的情况下删除 iOS 钥匙串(keychain)中帐户项目的密码?

iOS 模拟器不显示原型(prototype)单元格

objective-c - 在 UITableviewCell 高度动画的同时动画 CALayer 阴影

ruby - 为什么 Ruby setter 方法返回的是字符串而不是符号作为最后计算的表达式?

java - 将 Java 构造函数/方法标记为不供客户端使用的首选方法?

matlab - 对多个属性使用一个 set 方法 MATLAB