ios – 在Cocoa Touch中实现DebouncedCoalesced模式,如`layoutSubviews`

ios – 在Cocoa Touch中实现DebouncedCoalesced模式,如`layoutSubviews`,第1张

概述许多 Cocoa Touch类利用了合并事件的设计模式.例如,UIViews有一个方法setNeedsLayout,它可以在不久的将来调用layoutSubviews.这在许多属性影响布局的情况下尤其有用.在每个属性的setter中,您可以调用[self setNeedsLayout],这将确保布局将更新,但如果一次更改多个属性或者即使单个属性被修改多个,也会阻止对布局的许多(可能是昂贵的)更新运 许多 Cocoa touch类利用了合并事件的设计模式.例如,UIVIEws有一个方法setNeedsLayout,它可以在不久的将来调用layoutSubvIEws.这在许多属性影响布局的情况下尤其有用.在每个属性的setter中,您可以调用[self setNeedsLayout],这将确保布局将更新,但如果一次更改多个属性或者即使单个属性被修改多个,也会阻止对布局的许多(可能是昂贵的)更新运行循环的一次迭代中的时间.其他昂贵的 *** 作,如setNeedsdisplay和drawRect:方法对遵循相同的模式.

实现这样的模式的最佳方法是什么?具体来说,我想将一些依赖属性绑定到一个昂贵的方法,如果属性发生了变化,每次迭代运行循环需要调用一次.

可能的解决方案:

使用CAdisplaylink或NSTimer你可以得到这样的工作,但两者似乎都比必要的更多参与,我不确定将它添加到许多对象(尤其是计时器)的性能影响是什么.毕竟,性能是做这样的事情的唯一原因.

在某些情况下我使用过这样的东西:

- (voID)debounceSelector:(SEL)sel withDelay:(CGfloat)delay {    [NSObject cancelPrevIoUsPerformRequestsWithTarget:self selector:sel object:nil];    [self performSelector:sel withObject:nil afterDelay:delay];}

这在用户输入应该仅在连续动作或类似事件时触发某些事件的情况下工作得很好.当我们想要确保触发事件没有延迟时,我们只想在同一个运行循环中合并调用,这似乎很笨拙.

解决方法 NSNotificationQueue就是你想要的东西.请参阅 Coalescing Notifications上的文档

这是UIVIEwController中的一个简单示例:

- (voID)dealloc{    [[NSNotificationCenter defaultCenter] removeObserver:self];}- (voID)vIEwDIDLoad{    [super vIEwDIDLoad];    [[NSNotificationCenter defaultCenter] addobserver:self                                             selector:@selector(configureVIEw:)                                                 name:@"CoalescingNotificationname"                                               object:self];    [self setNeedsReload:@"vIEwDIDLoad1"];    [self setNeedsReload:@"vIEwDIDLoad2"];}- (voID)vIEwWillAppear:(BOol)animated{    [super vIEwWillAppear:animated];    [self setNeedsReload:@"vIEwWillAppear1"];    [self setNeedsReload:@"vIEwWillAppear2"];}- (voID)vIEwDIDAppear:(BOol)animated{    [super vIEwDIDAppear:animated];    [self setNeedsReload:@"vIEwDIDAppear1"];    [self setNeedsReload:@"vIEwDIDAppear2"];}- (voID)setNeedsReload:(Nsstring *)context{    NSNotification *notification = [NSNotification notificationWithname:@"CoalescingNotificationname"                                                                 object:self                                                               userInfo:@{@"context":context}];    [[NSNotificationQueue defaultQueue] enqueueNotification:notification                                               postingStyle:NSPostASAP                                               coalesceMask:NSNotificationCoalescingOnname|NSNotificationCoalescingOnSender                                                   forModes:nil];}- (voID)configureVIEw:(NSNotification *)notification{    Nsstring *text = [Nsstring stringWithFormat:@"configureVIEw called: %@",notification.userInfo];    NSLog(@"%@",text);    self.detailDescriptionLabel.text = text;}

您可以签出文档并使用postingStyle来获取所需的行为.在此示例中,使用NSPostASAP将为我们提供输出:

configureVIEw called: {    context = vIEwDIDLoad1;}configureVIEw called: {    context = vIEwDIDAppear1;}

意味着已经合并了对setNeedsReload的背靠背调用.

总结

以上是内存溢出为你收集整理的ios – 在Cocoa Touch中实现Debounced / Coalesced模式,如`layoutSubviews`全部内容,希望文章能够帮你解决ios – 在Cocoa Touch中实现Debounced / Coalesced模式,如`layoutSubviews`所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1107603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存