• NSTimer、 NSTask、 NSThread 和 NSRunloop 之间的区别


     

    • NSTimer是一个计时器对象,方法调用在对未来的选择对象。
    • NSThread是一个线程类。 也就是创建一个线程。
    • NSTask类是一个过程,一种方式运行程序从您的其他程序。
    • NSOperation是一个非常漂亮的抽象的任务。 在这个类中嵌入您的操作,你可以很容易地通过一个NSOperationQueue执行类的手段同时进行。
    • NSRunLoop其实NSRunLoop的本质是一个消息机制的处理模式。在某种意义上摘要和适应的选择()的Unix系统调用,管理和调度输入源事件和线程计时器。

    每个程序运行在至少一个线程 。 你能想到的每一个单独的进程中的程序执行的线程,每个其他平行进行。

    如果你有一些港口样的用户界面,或其他代码,需要听取网络事件,你需要一个运行循环 。 每个NSThread自动都有自己的运行循环,你很少有直接关心他们自己。 在运行循环也创造和释放autorelease池负责。

    [查看更多关于autorelease池的讨论意见。 最重要的一点要记住的是,新的线程必须考虑设立一个autorelease池照顾。 例如,与detachNewThreadSelector调用的方法应该为他们的第一个和最后一个行如下:

    NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ];  [code here]  [pool release]; 

    这同样适用于其他线程使用的技术产生。]

    主线程 ,所有的UI处理正在发生,运行循环是非常重要的,因为它保持了界面反应。 这就是为什么你应该永远不会运行的代码,就在主线程耗时:它会吃掉所有的线程和循环的运行时间将不会被允许运行往往不够,导致锁定或缓慢接口。 如果您需要执行耗时计算,或保持一个任务在后台运行,你应该创建一个新线程。 同样,你可能不必考虑新的运行循环正在形成。 在一个新线程执行的方法简单的方法:

    [NSThread detachNewThreadSelector:@selector(theSelector) toTarget:self withObject:nil]; 

    线程间的通信可能会非常棘手,你应该知道performSelector的方法:onThread:withObject:waitUntilDone:和performSelectorOnMainThread:withObject:waitUntilDone:

    定时器也处理运行循环。 相反运行循环,你可能经常会使用你的程序定时器直接。 建立一个最简单的方法是非常计时器:

    [self performSelector:@selector(aSelector) withObject:nil afterDelay:1.0]; 

    但有时你需要创建和管理NSTimer对象自己,例如能够取消和重新使用一个计时器。

    一个NSTask用于运行一个又一个计划,目前一子的。 这有点类似于一个独立的线程开始,但是如果子崩溃,您的主要程序将继续运行。 程序之间的通信也很不同从多个线程之间的通信在同一进程中。

    你用“iPhone”你的问题,并在iPhone你将永远不会使用NSTasks。

    NSOperations是用来当您需要处理不同的任务量较大,他们把队列和/或处理他们在单独的线程(虽然他们没有单独的线程中运行)。 如果您的应用程序需要创建只是少数人,专门线程,则没有理由使用NSOperation类。 但是,如果你会经常产生想与服务器通信任务()必须保持记录,NSOperation和NSOperationQueue能派上用场。

    NSRunLoop首先是Run Loop的部分概念,它的作用就是循环、处理事件。具体来说有两个方面: 1. 定时启动任务(一般用和Timer协作);2. 处理事件。
    在 单线程的app中,不需要注意Run Loop,但不代表没有。程序启动时,系统已经在主线程中加入了Run Loop。它保证了我们的主线程在运行起来后,就处于一种“等待”的状态(而不像一些命令行程序一样运行一次就结束了),这个时候如果有接收到的事件 (Timer的定时到了或是其他线程的消息),就会执行任务,否则就处于休眠状态。

    如果我们要写多线程的程序,可能就需要自己来管理Run Loop。
    下面说一下楼主提出的方法中的参数:
    RunMode: NSDefaultRunLoopMode,可以把这个理解为一个”过滤器“,我们可以只对自己关心的事件进行监视。一般NSDefaultRunLoopMode是最常用的。

    启动run loop的方法就是lz写的这个,它的说明如下:
    Runs the loop once, blocking for input in the specified mode until a given date.
    启动run loop一次,在特定的run loop mode下等待输入。

    如果没有附加input source或是timer,或是过limitDate,run loop就会退出,并且方法返回NO。

    下来是Run Loop的使用场合:
    1. 使用port或是自定义的input source来和其他线程进行通信
    2. 在线程(非主线程)中使用timer
    3. 使用 performSelector...系列(如performSelectorOnThread, ...)
    4. 使用线程执行周期性工作

    run loop不需要创建,在线程中只需要调用[NSRunLoop currentRunLoop]就可以得到
    假设我们想要等待某个异步方法的回调。比如connection。如果我们的线程中没有启动run loop,是不会有效果的(因为线程已经运行完毕,正常退出了)。

     
     
  • 相关阅读:
    Win8杂谈
    ipad还能横行霸道多久
    C++异步编程 for VS2011(二)
    C++异步编程 for VS2011(一)
    互联网催生的新的商业模式
    微信小程序用户评分实例
    即时通讯小程序实现代码
    CDN(内容分发网络)技术原理 枯木
    RHEL6.3下Zabbix监控实践之Zabbix的安装 枯木
    Firefox浏览器完美运行Firefox OS 枯木
  • 原文地址:https://www.cnblogs.com/tig666666/p/5464982.html
Copyright © 2020-2023  润新知