我经常只想触发一次某个函数,但我需要从另一个被反复调用的函数中触发它.例如,拍摄某些内容的快照供以后使用.我通常通过设置全局布尔值来实现.
我想知道我这样做是否真的是最好的方式?
我似乎记得读过全局变量是坏的,全局布尔变量更糟糕!
无论如何,这就是我通常只完成一次触发某个方法的方法:
在我的初始变量集中......
private var myStatus:Boolean = false;
然后,在经常被调用的函数内...
if (!myStatus) { doMyFunction(); myStatus = true; }
对我来说这似乎是合乎逻辑的,但它是正确的吗?
更新:嗯,基于我从你的答案中学到的东西,而不是检查一个全局布尔变量,我现在首先检查XML节点是否存在(我在将任何写入磁盘之前将图像存储在XML结构中),以及如果没有,那么我附加一个带有base64编码图像数据的新节点.我仍然设置一个布尔标志,以便稍后我可以用用户编辑的图像数据覆盖空白图像(如果需要).它完美地运作.感谢大家的帮助!
我现在对在某些情况下使用该特定(线程不安全)系统感到更舒服.
当你调用一个函数时,它应该按你所期望的那样对你提供的参数做.如果你以完全相同的方式调用函数两次,你应该期望该函数给你相同的结果或做同样的事情.
将此一次调用依赖项移动到多次调用函数的逻辑可能更好.如果您只需要调用该函数一次,则只需调用一次.或者,将不同的参数传递给函数以指示您正在执行不同的操作.
这真的取决于你的意思.如果您的代码将从多个线程调用,那么您有一个竞争条件,这可能意味着doMyFunction
可以多次调用.这是因为多个线程可以检查myStatus
,看到它是假的,然后调用doMyFunction
.您可以通过先设置变量来稍微改善一下情况:
if (!myStatus) { myStatus = true; doMyFunction(); }
但这只会缩小窗口的问题,并不能消除它.
要消除竞争条件,您需要锁定.