- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在编写一个带有 slider 的游戏。为了从解决状态开始随机播放游戏,我想定期重复调用 pushRandomPiece
以直观地随机播放游戏。
我一开始想使用 dispatch_after 但我对触发日期有疑问:
这个有效:
-(void)shuffle {
for (int i=0; i<50;i++)
[self performSelector:@selector(pushRandomPiece) withObject:nil afterDelay:i*0.50*2];
}
pushRandomPiece 中两次连续调用之间的差异几乎始终等于一秒。
但这行不通:
-(void)shuffle {
for (int i=0; i<50;i++)
// [self performSelector:@selector(pushRandomPiece) withObject:nil afterDelay:i*0.50*2];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, i*NSEC_PER_SEC*0.5*2), dispatch_get_main_queue(), ^{ [self pushRandomPiece]; });
}
这是连续调用之间的时间差:
2013-10-01 11:02:53.147 SlidingPuzzle[2006:60b] diff= 1.077376
2013-10-01 11:02:54.262 SlidingPuzzle[2006:60b] diff= 1.111863
2013-10-01 11:02:55.335 SlidingPuzzle[2006:60b] diff= 1.070456
2013-10-01 11:02:56.455 SlidingPuzzle[2006:60b] diff= 1.117381
2013-10-01 11:02:57.542 SlidingPuzzle[2006:60b] diff= 1.084070
2013-10-01 11:02:58.655 SlidingPuzzle[2006:60b] diff= 1.110574
2013-10-01 11:02:59.757 SlidingPuzzle[2006:60b] diff= 1.098654
2013-10-01 11:03:00.862 SlidingPuzzle[2006:60b] diff= 1.103132
2013-10-01 11:03:01.956 SlidingPuzzle[2006:60b] diff= 1.091535
2013-10-01 11:03:03.050 SlidingPuzzle[2006:60b] diff= 1.090532
2013-10-01 11:03:04.160 SlidingPuzzle[2006:60b] diff= 1.107981
2013-10-01 11:03:04.164 SlidingPuzzle[2006:60b] diff= 0.000982
2013-10-01 11:03:06.354 SlidingPuzzle[2006:60b] diff= 2.187945
2013-10-01 11:03:06.357 SlidingPuzzle[2006:60b] diff= 0.000862
2013-10-01 11:03:08.498 SlidingPuzzle[2006:60b] diff= 2.139442
2013-10-01 11:03:08.501 SlidingPuzzle[2006:60b] diff= 0.000805
2013-10-01 11:03:10.750 SlidingPuzzle[2006:60b] diff= 2.246749
2013-10-01 11:03:10.753 SlidingPuzzle[2006:60b] diff= 0.000839
下面是让方 block 移动的方法:
-(void) pushRandomPiece {
NSSet * s = [self freeBlocks];
int n = [s count];
int piece = arc4random_uniform(n);
Piece * p = [[s allObjects] objectAtIndex:piece];
dispatch_async(dispatch_get_main_queue(), ^{
[self pushPiece:p];
});
}
最佳答案
dispatch_after
仅在您指定的时间后将您的 block 添加到队列中。如果队列为空,您的 block 可能会在添加到队列后立即运行。否则,它可能会在运行之前在队列中等待一段时间——等待其他任务完成。
关于ios - dispatch_after 与 performSelector afterDelay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19112182/
这个问题在这里已经有了答案: performSelector may cause a leak because its selector is unknown (19 个回答) 关闭 9 年前。
使用此语句会立即调用选择器,而不是从现在开始 6 秒。 this.PerformSelector(myStartWaitForSoundSelector, null, 6.0f); 有谁知道如何让它延
如果我用这个开始做某事: > [self performSelector:@selector(runThis:) > withObject:thisObject > afterDelay
虽然它在模拟器上似乎不会造成问题,但在设备上使用 performSelectorInBackground 会导致内存泄漏。或者至少 Instruments 是这么表示的。查看代码我没有任何线索可能是什
我有一个包含多个部分的 UITableView。每个部分包含一组不同的数据:电话号码、地址.... 对于这些集合中的每一个,我都有一个模型:PhoneNumber、Address。它们完全不同,但有一
我知道这两者有点相似,但两者之间肯定有任何内在差异, [anObject performSelector:@selector(thisMethod:) withObject:passedObject]
我想做performSelector:withObject:,但对象是CGFloat。所以它实际上不是一个对象。我怎样才能做到这一点? 我正在执行选择器的对象不是我的,我无法修改它。 例如 [xyz
我正在搞乱一些线程。现在考虑一下:我有一个主线程。我开始一个新线程。在它的入口点方法中,我想创建一个运行循环。现在文档告诉我我必须有一个输入源。否则我的运行循环会立即退出。坏的。好的。但除了我的 Pe
我想执行有几个参数的方法。有什么简单的方法可以一次通过其中的几个吗?有点像 [self performSelector:@selector(methodName) withObject:firstPa
我想执行有几个参数的方法。有什么简单的方法可以一次通过其中的几个吗?有点像 [self performSelector:@selector(methodName) withObject:firstPa
为了进行调试,我需要从一段代码中调用CGFloat访问器方法,该代码根据iVar的名称生成选择器。 - (CGFloat) myIVar { return myIVar; } 设置者具有以下形
我有一个自定义 BackBarButton,我有一个属性来存储在某些情况下可以更改的选择器。所以我不能很顺利地使用委托(delegate)。 在不将“工作流程”更改为委派的情况下,我该怎么做才能消除此
我收到 ARC 编译器的以下警告: "performSelector may cause a leak because its selector is unknown". 这就是我正在做的事情: [_
这可能是一个幼稚的问题,但我还是会问这个问题,因为我找不到任何文档来解决我脑海中的这个问题。 我使用 Xcode45-DP4 在设备和模拟器中运行 iOS5.1。 我有一个循环遍历一个类的多个实例的数
我在这段代码中使用 performSelector 方法时遇到了一些问题: 这个方法在另一个名为“JSONMethods”的类中: +(void)sendPostMsgWithMultipleArgu
背景:我有一个代表与服务器连接的对象(我们称之为 BackendClient)。它的方法生成为单个 @protocol 并且它们都是同步的,所以我想创建将在后台调用它们的代理对象。主要问题是返回值,我
我熟悉此 ARC 警告 ( performSelector may cause a leak because its selector is unknown ) 的解决方案,并在大多数情况下实现了它们
这行代码完美运行 [self explodeBomb:obj]; 但是如果我用下面的行替换它,我会得到一个 NSInvalidArgument 异常,原因是无法识别的选择器。 [self perfo
我在另一个类中有一个方法,我这样调用这个方法 [captureView performSelector:@selector(startRecording) withObject:nil afterDe
是否可以使用此方法并传递一个对象?使用此代码,我收到此错误: -[myApp hideUpdateView]: unrecognized selector sent to instance 0x8b6
我是一名优秀的程序员,十分优秀!