标签: nsrunloop

iOS,NSURLConnection:在不同线程上委托回调?

我怎样才能让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)

我没有看到的另一件事是"模式"只记录了两种模式,所以没有多少真正要测试.

有任何想法吗?

谢谢

nsurlconnection nsrunloop ios

8
推荐指数
1
解决办法
9281
查看次数

停止NSRunLoop

我在一个线程中有一个连接,所以我将它添加到运行循环中以获取所有数据:

  [[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)

我怎么能阻止这个循环呢?

cocoa cocoa-touch nsurlconnection cfrunloop nsrunloop

8
推荐指数
1
解决办法
6377
查看次数

在运行循环的开始/结束时执行选择器

iOS中的所有事件和方法都使用NSRunLoop以下方式处理:用户事件,方法调用,旋转,计时器,连接等.

我的问题是:

如何在运行循环的精确时刻执行选择器作为开始和结束?

cocoa objective-c selector nsrunloop ios

8
推荐指数
1
解决办法
2429
查看次数

在Objective - C中的另一个线程中的计时器

我必须定义应该以一定的时间间隔定期调用的方法.我需要在另一个线程(非主线程)中调用它,因为此方法用于从外部API获取信息并在核心数据中同步数据.

如何定义此方法以阻止主线程?

objective-c nstimer nsrunloop ios nsblockoperation

8
推荐指数
1
解决办法
9393
查看次数

当NSMenu在Swift中打开时,NSTimer不会触发

我有一个计时器,一旦它关闭就会运行以重启警报.

alarm = NSTimer.scheduledTimerWithTimeInterval(
    60 * minutesConstant + secondsConstant,
    target:self,
    selector: Selector("endSession"),
    userInfo: nil,
    repeats:false)
Run Code Online (Sandbox Code Playgroud)

它的选择器函数设置一个模式标志,并调用原始函数,用新的分钟和秒常量设置警报,并发送会话已重新启动的用户通知.

我有一个菜单项,可以使用剩余时间进行更新

在此输入图像描述

所以我一直打开它来检查我的闹钟确实重启,并且一旦它达到零就会显示通知.它可以工作,但是当我打开菜单并且它降到零时它只停留在0:00并且计时器不会触发,直到我点击菜单,此时它立即显示通知并重置计时器.

当菜单打开时,如何强制定时器触发?这不是什么大不了的事,但我不希望用户与会话混淆,如果他们看到计时器停机就会挂起.

macos xcode nstimer nsrunloop swift

8
推荐指数
1
解决办法
1379
查看次数

当应用程序进入后台并返回时,我的NSRunLoop和计时器会发生什么?

我的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:

iphone objective-c nstimer nsrunloop ios

7
推荐指数
1
解决办法
1142
查看次数

Xamarin Android:使用Alert Dialog保持控制,直到单击一个按钮

我们使用静态警报对话框来获取用户对某些操作的确认.在我们打电话中,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吗?

android nsrunloop xamarin.android

7
推荐指数
1
解决办法
4208
查看次数

iOS上runloop中的操作顺序

iOS上的操作顺序是什么?

我正在考虑时间问题

  • setNeedsLayoutlayoutSubviews
  • setNeedsDisplaydrawRect
  • 触摸识别
  • [NSTimer scheduledTimerWithTimeInterval:0.000001 tar(...)]
  • dispatch_async(dispatch_get_main_queue(), ^{ /* code */}

作为我希望收到的答案的一个例子,它可以采用以下格式:

main上的dispatch_async 在下一个运行周期之前发生

drawRect 在运行周期结束时发生

nsthread grand-central-dispatch nsrunloop ios

7
推荐指数
1
解决办法
1332
查看次数

scheduleInRunLoop - 线程网络连接

我没有找到任何可以解释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)

我在想以下几点:

  • 您不能委派当前类中的两个线程的责任,您必须委托给单独的对象.
  • 一个线程可以为两个流做什么?(我个人并不这么认为,因为输入/输出会同时运行)
  • 我认为这是错误的,你可以创建一个单独的运行循环并调用scheduleRunLoop对一些单独的线程?

有任何想法吗?

cocoa multithreading objective-c nsstream nsrunloop

6
推荐指数
1
解决办法
3449
查看次数

NSRunLoop做什么?

我读到很多帖子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

port nsthread nsrunloop ios

6
推荐指数
1
解决办法
7680
查看次数