我正在搞乱线程.现在考虑一下:我有一个主线程.我开始一个新的主题.在它的入口点方法中,我想做一个运行循环.现在文档告诉meh我必须有一个输入源.否则我的运行循环立即退出.坏.好的.但我没有其他输入源而不是我的performSelector ...方法调用.在线程启动之后,会出现一个performSelector方法,该方法会在延迟一段时间后在该线程上启动另一个方法.在该方法内部发生另一个performSelector调用,依此类推.每个延迟在0.1到1秒之间.所以反复点火计时器是无意义的;-)
我怎么能设置那个运行循环所以它保持活着以接收来自performSelector的踢法?我希望线程在无事可做的时候睡觉.但是当一个performSelector踢到他的屁股时,我希望线程醒来并起作用.
任何建议,任何人?
本月早些时候,我问过这个问题'什么是runloop?' 在阅读了答案并做了一些尝试后,我得到了它的工作,但我仍然不完全理解它.如果一个runloop只是一个与一个线程关联的循环而且它不会在后台产生另一个线程,那么我的线程中的任何其他代码(mainthread保持简单)如何执行而不会被"阻塞"/不运行因为它在某个地方造成无限循环?
这是第一个问题.然后到我的第二个.
如果我在使用了这个之后得到了一些正确的东西,但是没有完全理解它是一个循环,你附加'标志'通知runloop,当它到达标志点,它"停止"和执行那个附加的任何处理程序?然后它继续运行到下一个.

因此,在这种情况下,没有事件放在连接中的que中,但是当它涉及事件时,它采取与tap 1相关联的任何操作并在它再次运行到连接之前执行它,依此类推.或者我是否可以理解这个概念?
我需要延迟一段时间,但允许同一个runloop上的其他东西继续运行.我一直在使用以下代码来执行此操作:
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
Run Code Online (Sandbox Code Playgroud)
这似乎正是我想要的,除了有时函数立即返回而不等待所需的时间(1秒).
任何人都可以告诉我这可能导致什么?在允许运行循环运行的同时等待的正确方法是什么?
注意:我想以类似于sleep()的方式延迟,这样在延迟之后我回到与之前相同的执行流中.
我有url连接,通常工作正常
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:delegate];
Run Code Online (Sandbox Code Playgroud)
但是当我创建一个模态窗口时,没有请求收到响应:
[NSApp runModalForWindow:window];
Run Code Online (Sandbox Code Playgroud)
如果我评论这一行,从而创建一个"标准"窗口,一切正常.
我尝试从NSURLConnectionDelegate实现所有方法,而不是调用它们中的一个.
我怀疑这是关于'run loops'的事情,但是在这方面没什么经验.有没有人有这方面的经验?
谢谢
我已经制作了一个带有计时器的RunLoop,它可以更新显示倒计时的标签.倒计时到零时我需要RunLoop停止,对于计时器正常结束的情况,我可以使用runUntilDate,日期是当前日期+倒计时时间.问题是当用户在按钮完成之前取消倒计时.我不知道如何告诉RunLoop停止取消按钮操作.这是RunLoop的代码:
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
[self methodSignatureForSelector:@selector(updateCountdownLabel:)]];
[invocation setTarget:self];
[invocation setSelector:@selector(updateCountdownLabel:)];
[[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES] forMode:NSRunLoopCommonModes];
Run Code Online (Sandbox Code Playgroud)
该方法只是告诉标签在每个循环中减少1.
我可以告诉取消按钮将标签更改为零,并让运行循环选择器检查值是否为零,但RunLoop自己的选择器是否可以告诉它停止?
cancelPerformSelector:target:argument:
cancelPerformSelectorsWithTarget:
Run Code Online (Sandbox Code Playgroud)
这些是我发现的最接近但它们似乎不是从RunLoops自己的选择器内部工作,或者至少不是我尝试过它们的任何方式.
基本上我需要让按钮告诉RunLoop停止,或以某种方式阻止RunLoop从它自己的选择器.
谢谢.
我正在尝试使用iPhone SDK 3.0在线程上运行NSTimer.我想我正在做的一切正确(新的runloop等).如果我在viewDidDissappear上调用[timer invalidate]虽然我收到此错误:
bool _WebTryThreadLock(bool),0x3986d60:试图从主线程或Web线程以外的线程获取Web锁.这可能是从辅助线程调用UIKit的结果.现在崩溃...程序收到信号:"EXC_BAD_ACCESS".
这是我的代码:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[activityIndicator startAnimating];
NSThread* timerThread = [[NSThread alloc] initWithTarget:self selector:@selector(timerStart) object:nil]; //Create a new thread
[timerThread start]; //start the thread
}
-(void)timerStart
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
//Fire timer every second to updated countdown and date/time
timer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(method) userInfo:nil repeats:YES] retain];
[runLoop run];
[pool release];
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[timer invalidate];
}
Run Code Online (Sandbox Code Playgroud)
当我删除使计时器无效的行时,一切正常.我不应该使它无效或我是否犯了其他错误?
谢谢
我正在阅读核心动画编程指南,在"交易"一章中,我看到了这一点
要点:从没有runloop的线程修改图层属性时,必须使用显式事务.
但是来自Apple的NSRunLoop文档
您的应用程序无法创建或显式管理NSRunLoop对象.每个NSThread对象(包括应用程序的主线程)都会根据需要自动为其创建NSRunLoop对象.
这不是说每个线程都有一个runloop吗?或者不是由NSThread创建的线程,例如POSIX的pthread
我开始为 HID 设备编码。我开始阅读 Apple 文档和示例代码。提供的代码已经过时了,甚至无法在 Xcode8 中打开。
我需要帮助来查找示例项目/片段以开始使用 HID 服务!打开句柄,向设备读取和写入报告,在运行循环中收听设备生成的报告。
调用performSegue是否应该停止进一步的代码执行并将执行传递给目标?
我有这个简单的调用:performSegue(withIdentifier:"showTweets",sender:self)但是在该行仍在执行之后看起来像下面的代码......这是正常的吗?
我知道当 runloop 处于 state 时,自动释放池会释放对象kCFRunLoopBeforeWaiting。
所以我创建了一个后台线程,默认情况下 runloop 不运行。
如果我在这个后台线程中使用自动释放池,它什么时候释放对象。