我怎样才能让NSURLConnection从不同的线程而不是主线程调用它的委托方法.我正在尝试使用scheduleInRunLoop:forMode:但似乎没有做我想要的.
我必须下载一个大文件,它会频繁地中断主线程,以至于正在发生的一些渲染开始变得不稳定.
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
NSRunLoop * loop = [NSRunLoop currentRunLoop];
NSLog(@"loop mode: %@",[loop currentMode]);
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[connection start];
Run Code Online (Sandbox Code Playgroud)
我没有看到的另一件事是"模式"只记录了两种模式,所以没有多少真正要测试.
有任何想法吗?
谢谢
我在一个线程中有一个连接,所以我将它添加到运行循环中以获取所有数据:
[[NSRunLoop currentRunLoop] run];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
Run Code Online (Sandbox Code Playgroud)
但我找不到任何阻止它的方法
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
if([NSRunLoop currentRunLoop]){
[[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget:self];
}
[connection cancel];
}
Run Code Online (Sandbox Code Playgroud)
我怎么能阻止这个循环呢?
iOS中的所有事件和方法都使用NSRunLoop以下方式处理:用户事件,方法调用,旋转,计时器,连接等.
我的问题是:
如何在运行循环的精确时刻执行选择器作为开始和结束?
我必须定义应该以一定的时间间隔定期调用的方法.我需要在另一个线程(非主线程)中调用它,因为此方法用于从外部API获取信息并在核心数据中同步数据.
如何定义此方法以阻止主线程?
我有一个计时器,一旦它关闭就会运行以重启警报.
alarm = NSTimer.scheduledTimerWithTimeInterval(
60 * minutesConstant + secondsConstant,
target:self,
selector: Selector("endSession"),
userInfo: nil,
repeats:false)
Run Code Online (Sandbox Code Playgroud)
它的选择器函数设置一个模式标志,并调用原始函数,用新的分钟和秒常量设置警报,并发送会话已重新启动的用户通知.
我有一个菜单项,可以使用剩余时间进行更新

所以我一直打开它来检查我的闹钟确实重启,并且一旦它达到零就会显示通知.它可以工作,但是当我打开菜单并且它降到零时它只停留在0:00并且计时器不会触发,直到我点击菜单,此时它立即显示通知并重置计时器.
当菜单打开时,如何强制定时器触发?这不是什么大不了的事,但我不希望用户与会话混淆,如果他们看到计时器停机就会挂起.
我的NSRunLoop应用程序连接到计时器:
NSTimer *updateTimer = [NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(onUpdateTimer) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:updateTimer forMode:NSRunLoopCommonModes];
Run Code Online (Sandbox Code Playgroud)
当应用程序进入后台时,这个runloop会发生什么?它是否会消失,这意味着我应该重新创建它applicationDidBecomeActive:?
我们使用静态警报对话框来获取用户对某些操作的确认.在我们打电话中,Show()我们想要保持控制,直到用户点击一个按钮,这样我们就可以在Show()通话结束时返回按钮点击结果.
我们的iOS版本(a UIAlertView)使用
while (displayed)
{
MonoTouch.Foundation.NSRunLoop.Current.RunUntil(
MonoTouch.Foundation.NSDate.FromTimeIntervalSinceNow(0.2));
}
Run Code Online (Sandbox Code Playgroud)
在其Show()方法中,在返回其按钮选择之前等待用户输入.
我们可以在Monodroid中使用Android吗?
iOS上的操作顺序是什么?
我正在考虑时间问题
setNeedsLayout 和 layoutSubviewssetNeedsDisplay 和 drawRect[NSTimer scheduledTimerWithTimeInterval:0.000001 tar(...)]dispatch_async(dispatch_get_main_queue(), ^{ /* code */}作为我希望收到的答案的一个例子,它可以采用以下格式:
main上的dispatch_async 在下一个运行周期之前发生
drawRect 在运行周期结束时发生
我没有找到任何可以解释NSStream线程化过程的文档.具体来说,让我们去NSInputStream.在Objective-C中对我的线程目前是一个谜,因为它看起来如此简单.
我的问题主要是指这一行:
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
Run Code Online (Sandbox Code Playgroud)
您可以指定输入流将运行的运行循环,我认为这很酷.问题是,如果我希望输入和输出流在他们自己的线程中运行,并且两者都在单个类中实例化,比如Connection,那么如何让它们在自己的线程中运行?
我问的原因是因为代表们.以前我们已经完成了[inputStream setDelegate:self]这意味着我们必须声明stream:handleEvent处理传入/传出数据.
所以最后我的问题是,如果你有一个设置输入和输出流的类,你如何将每个流线程化并将处理流事件的责任委托给当前的类?
这里有一些代码可供选择:
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
Run Code Online (Sandbox Code Playgroud)
我在想以下几点:
有任何想法吗?
我读到很多帖子NSRunLoop,像这个,这个,这个.但无法弄清楚究竟NSRunLoop做了什么
我通常看到的是一个工人线程
wthread = [[NSThread alloc] initWithTarget:self selector:@selector(threadProc) object:nil];
[wthread start];
Run Code Online (Sandbox Code Playgroud)
里面有一个NSRunLoop
- (void)threadProc
{
NSAutoreleasePool* pool1 = [[NSAutoreleasePool alloc] init];
BOOL isStopped = NO;
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
[runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
while (!isStopped)
{
{
NSAutoreleasePool* pool2 = [[NSAutoreleasePool alloc] init];
[runloop runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]];
[pool2 release];
}
}
[pool1 release];
}
Run Code Online (Sandbox Code Playgroud)
主线程将一些工作传递给了这个wthread
[self performSelector:@selector(someWork:) onThread:wthread withObject:nil waitUntilDone:NO];
Run Code Online (Sandbox Code Playgroud)
在将工作从主线程传递到工作线程方面,我看到很多人这样做.为什么需要NSRunLoop?它有什么作用 ?
我读了NSRunLoop用于管理事件,为什么会出现什么叫除外runMode里面threadProc?