判断当前是不是有performselected afterdelay在线程中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断当前是不是有performselected afterdelay在线程中相关的知识,希望对你有一定的参考价值。

参考技术A ios中timer相关的延时调用,常见的有NSObject中的performSelector:withObject:afterDelay:这个方法在调用的时候会设置当前runloop中timer,还有一种延时,直接使用NSTimer来配置任务。这两种方式都一个共同的前提,就是当前线程里面需要有一个运行的runloop并且这个runloop里面有一个timer。我们知道:只有主线程会在创建的时候默认自动运行一个runloop,并且有timer,普通的子线程是没有这些的。这样就带来一个问题了,有些时候我们并不确定我们的模块是不是会异步调用到,而我们在写这样的延时调用的时候一般都不会去检查运行时的环境,这样在子线程中被调用的时候,我们的代码中的延时调用的代码就会一直等待timer的调度,但是实际上在子线程中又没有这样的timer,这样我们的代码就永远不会被调到。下面的代码展示了performSelector和dispatch_time的不同/testDispatch_after延时添加到队列/-(void)testDispatch_afterdispatch_time_ttime=dispatch_time(DISPATCH_TIME_NOW,3NSEC_PER_SEC);dispatch_after(time,dispatch_get_main_queue(),^NSLog(@"3秒后添加到队列"););-(void)testDelayNSLog(@"3秒后testDelay被执行");/dispatch_barrier_async栅栏的作用*/-(void)testDispatch_Barrier//dispatch_queue_tgcd=dispatch_queue_create("这是序列队列",NULL);dispatch_queue_tgcd=dispatch_queue_create("这是并发队列",DISPATCH_QUEUE_CONCURRENT);dispatch_async(gcd,^NSLog(@"b0");//这个selector不会执行[selfperformSelector:@selector(testDelay)withObject:nilafterDelay:3];//代码会执行//[selftestDispatch_after];);dispatch_release(gcd);在有多线程操作的环境中,这样performSelector的延时调用,其实是缺乏安全性的。我们可以用另一套方案来解决这个问题,就是使用GCD中的dispatch_after来实现单次的延时调用

如何判断您当前是不是位于 HTML 表格的最后一行?

【中文标题】如何判断您当前是不是位于 HTML 表格的最后一行?【英文标题】:How to tell if you're currently in the last row of an HTML table?如何判断您当前是否位于 HTML 表格的最后一行? 【发布时间】:2011-05-25 13:55:40 【问题描述】:

我有一个 keydown 事件,用于向表格添加空白行。 但我只希望在光标位于表的最后一行时发生 keydown 事件时添加新行。

这是我当前的 jQuery 事件。 .glCreditValue 是输入文本框的类,它位于表格行的最后一个 TD 中。 因此,当用户退出该输入时,如果输入所在的 TD 在表的最后一行,我想添加一个新行。

由于表格数据是动态生成的,所以每一行的最终 TD 都有一个输入文本框,其类为 .glCreditValue。

$(".glCreditValue").keydown(function(event) 
        var keycode = event.keyCode;
        if (keycode == 9) 
            //HERE i would like to make sure that i'm in the last row of the table
            AddNewRow();
        
    );

我正在尝试使用 tr:last 选择器,但我不确定从这里到哪里去。

【问题讨论】:

您要处理整个最后一行的点击,还是只处理最后一行的最后一列? 只是最后一列,这就是我只指定 .glCreditValue keydown 的原因。只有每行最终 TD 中的输入文本框才分配了该类。 【参考方案1】:

有几种方法可以做到这一点,例如你可以检查.closest()<tr>,看看它是不是.is():last-child,像这样:

$(".glCreditValue").keydown(function(event) 
  if (event.which == 9 && $(this).closest("tr").is(":last-child")) 
      AddNewRow();
  
);

【讨论】:

成功了!谢谢!我会在大约 6 分钟内“接受”作为我的答案,当它允许我时,哈哈。 @Nick 讨厌挖掘一个较旧的问题,但是在条件条件中添加对 shift 键的检查是否有用/可取?那会阻止“tab-left”触发条件,不是吗?很棒的答案,不管... :] @Tieson - 当然,这取决于您所追求的 UI 行为。如果您想阻止转移,那么只需在该if 检查的开头添加一个!event.shiftKey && 。不过,从 UI 的角度来看,我希望 shift 版本能够撤消新行(如果它只是空的?),所以这将是您在 IMO 中想要的一些额外代码。 【参考方案2】:

一种避免运行选择器开销的方法是简单地获取the .closest() row,然后转到the .next() element 并测试its .length property。

如果您在最后一个<tr>,它将是0

if( !$(this).closest('tr').next().length ) 
   // was the last row

【讨论】:

以上是关于判断当前是不是有performselected afterdelay在线程中的主要内容,如果未能解决你的问题,请参考以下文章

php获取当前网页域名,并判断是不是为域名A,如果是就跳出判断语句,不是就跳转到域名A。

js/jquery 如何判断当前是不是具有某个事件 比如说是不是具有hover事件

怎么判断当前坐标是不是在矩形内(外)部

如何判断当前时间是不是在一个时间段内?

Android 在当前WebView打开页面,判断是不是有

jquery draggable 怎么判断当前控件是不是被禁止拖动