`
linwwwei
  • 浏览: 222880 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IOS开发中NSRunloop跟NSTimer的问题

 
阅读更多
在Windows时代,大家肯定对SendMessage,PostMessage,GetMessage有所了解,这些都是windows中的消息处理函数,那对应在ios中是什么呢,其实就是NSRunloop这个东西。在ios中,所有消息都会被添加到NSRunloop中,分为‘input source’跟'timer source'种,并在循环中检查是不是有事件需要发生,如果需要那么就调用相应的函数处理。
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1
                                              target:self
                                            selector:@selector(printMessage:)
                                            userInfo:nil
                                             repeats:YES];
}
这个时候如果我们在界面上滚动一个scrollview,那么我们会发现在停止滚动前,控制台不会有任何输出,就好像scrollView在滚动的时候将timer暂停了一样,在查看相应文档后发现,这其实就是runloop的mode在做怪。
runloop可以理解为cocoa下的一种消息循环机制,用来处理各种消息事件,我们在开发的时候并不需要手动去创建一个runloop,因为框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们可以得到一个当前线程下面对应的runloop对象,不过我们需要注意的是不同的runloop之间消息的通知方式。

接着上面的话题,在开启一个NSTimer实质上是在当前的runloop中注册了一个新的事件源,而当scrollView滚动的时候,当前的MainRunLoop是处于UITrackingRunLoopMode的模式下,在这个模式下,是不会处理NSDefaultRunLoopMode的消息(因为RunLoop Mode不一样),要想在scrollView滚动的同时也接受其它runloop的消息,我们需要改变两者之间的runloopmode.
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
简单的说就是NSTimer不会开启新的进程,只是在Runloop里注册了一下,Runloop每次loop时都会检测这个timer,看是否可以触发。当Runloop在A mode,而timer注册在B mode时就无法去检测这个timer,所以需要把NSTimer也注册到A mode,这样就可以被检测到。

说到这里,在http异步通信的模块中也有可能碰到这样的问题,就是在向服务器异步获取图片数据通知主线程刷新tableView中的图片时,在tableView滚动没有停止或用户手指停留在屏幕上的时候,图片一直不会出来,可能背后也是这个runloop的mode在做怪.
分享到:
评论

相关推荐

    ios 时间定时器 NSTimer应用demo

    在iOS开发中,`NSTimer`是一个非常重要的类,它允许开发者在指定的时间间隔后执行某段代码,或者定期重复执行某任务。本教程将基于"ios 时间定时器 NSTimer应用demo",深入探讨`NSTimer`的使用方法、工作原理以及...

    IOS应用源码——nstimer.zip

    在iOS应用开发中,NSTimer是一个非常重要的组件,它允许开发者在特定的时间间隔执行特定的任务。这个"IOS应用源码——nstimer.zip"文件显然包含了关于如何在iOS应用中使用NSTimer的源代码示例。NSTimer是Foundation...

    ios计时器NSTimer的使用

    在iOS开发中,`NSTimer` 是一个非常重要的类,用于在特定的时间间隔后执行某个操作,例如倒计时或定期更新UI。本教程将深入探讨`NSTimer`的使用,包括如何创建、启动、暂停以及取消定时器,并通过一个倒计时10秒的...

    简单的时间选择器Nstimer

    `NSTimer`是苹果iOS和macOS开发中的一个核心组件,用于执行周期性的任务或者在特定时间点触发某个动作。这个“简单的时间选择器Nstimer”是一个实用工具,它提供了一个用户界面来控制`NSTimer`,允许用户进行暂停、...

    iOS NSTimer循环引用的办法

    iOS 开发中,NSTimer 循环引用的问题是一个常见的问题。NSTimer 在创建时,会对 target 进行强引用,直到定时器作废。这样就会导致 NSTimer 和 target 之间形成循环引用,无法释放内存。今天,我们将介绍 iOS ...

    iOS 开发 之 多线程总结

    iOS开发中的多线程技术是提升应用性能和用户体验的关键,特别是在处理耗时操作时,如网络请求、数据计算或大文件上传。本文将对多线程进行深入总结,主要涵盖线程的基本概念、使用多线程的原因以及在iPhone平台上...

    IOS 中NSTimer定时器的使用

    nstimer 是 iOS 开发中一个常用的工具,用于执行周期性的任务。它的工作原理是将自身添加到RunLoop(运行循环)中,然后按照设定的时间间隔触发指定的方法。在本文中,我们将深入探讨如何在 iOS 中使用 NSTimer,...

    iOS中的NSTimer定时器的初步使用解析

    在iOS开发中,`NSTimer` 是一个非常重要的类,用于执行周期性的任务。它允许开发者在指定的时间间隔后执行某个方法。本文将详细介绍如何在iOS应用中初步使用`NSTimer`,以及解决一些常见的问题。 首先,创建一个`...

    NSTimer定时器

    在iOS和macOS开发中,`NSTimer`是苹果提供的一种强大的工具,用于在特定时间间隔后执行某个操作。它是Foundation框架的一部分,适用于Objective-C和Swift开发者。`NSTimer`可以让你的应用程序按照预设的时间间隔执行...

    NSTimer 使用 文档说明

    在iOS开发中,`NSTimer`是一个非常实用且常见的类,它可以帮助开发者实现定时任务的功能。本文将深入解析`NSTimer`的使用方法,包括如何创建定时器、设置定时器的属性以及如何管理定时器的生命周期等。 #### 二、...

    iOS中最全的各种定时器使用教程

    NSTimer 是 iOS 中最基本的定时器,它可以根据设置的时间间隔来执行某个任务。NSTimer 的初始化方法有多种,包括scheduledTimerWithTimeInterval:repeats:block:和scheduledTimerWithTimeInterval:invocation:...

    iOS计时器(OC版)

    在iOS开发中,计时器(Timer)是一个非常常见的组件,用于执行周期性的任务或触发特定事件。在Objective-C(OC)中,我们通常使用`NSTimer`来实现这一功能。下面将详细介绍如何使用`NSTimer`来创建一个计时器,以及...

    IOS——解决后台返回后计数器不准确问题

    在iOS开发中,遇到的一个常见问题是当应用进入后台并随后返回到前台时,计时器(如NSTimer)的计数可能不准确。这通常是因为iOS系统为了节省资源,会暂停非重要任务,包括定时器,当应用进入后台。本教程将详细讲解...

    ios tableView 利用run Loop

    在iOS开发中,UITableView是一种非常常见的控件,用于展示数据列表。然而,当数据量大时,一次性加载所有cell可能导致性能问题,此时就需要使用“懒加载”(Lazy Loading)技术。"ios tableView 利用run Loop"就是一...

    NSRunLoopDemo

    在iOS开发中,`NSRunLoop` 是一个至关重要的概念,它是事件循环(event loop)的核心机制。`NSRunLoopDemo` 提供了关于`NSRunLoop`的实践案例,包括使用Timer、自定义Source、DispatchSource、配置RunLoop以及添加...

    IOS应用源码——timer.rar

    在iOS开发中,计时器(Timer)是一个非常重要的组件,它允许我们在应用程序中实现定时触发某些事件或操作。这份"IOS应用源码——timer.rar"压缩包包含了一个关于iOS计时器使用的示例项目,我们可以从中学习到如何在...

    IOS应用源码——timer.zip

    在iOS开发中,掌握源码级别的知识对于提升应用性能和理解系统运作机制至关重要。这个"timer.zip"压缩包显然包含了与iOS应用中的定时器(Timer)相关的源代码。定时器在iOS应用程序中扮演着重要角色,它允许开发者在...

    RunLoop例子

    Run Loop是iOS开发中的一个重要概念,它在应用程序的生命周期中起着核心的作用。Run Loop,直译为“运行循环”,是一种机制,用于管理程序的主要线程(通常称为主线程)如何处理事件和用户输入,同时保持低功耗状态...

    iOS开发定时器的三种方法分享

    在iOS开发中,定时器是实现周期性任务或者在特定时间点执行操作的重要工具。本文主要探讨了三种常用的iOS定时器实现方式:NSTimer、CADisplayLink和GCD(Grand Central Dispatch)。每种方法都有其特定的应用场景和...

    ios-定时器的使用.zip

    在iOS开发中,定时器(Timer)是一种非常重要的工具,它允许我们在特定的时间间隔执行某个任务,例如更新UI、执行动画、实现心跳检测等。在本教程中,我们将深入探讨如何在iOS应用中使用定时器,并通过“火苗”这个...

Global site tag (gtag.js) - Google Analytics