• iOS中的系统目录(Documents、tmp、Library)、RunLoop的一些知识点


    学习内容

    欢迎关注我的iOS学习总结——每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary

    实现轮播图需要注意的地方

    1. 需要几张轮播图就设置UIScrollView的contentSize的宽度为自身的几倍

      • //设置高度为0是为了限制UIScrollView只能在x轴方向滚动,如果设置x为0那么只能在y轴方向滚动
        CGSizeMake(自身宽度*n,0)
        
    2. 使用NSTImer定时器定时滚动时避免循环引用

      • 这里一般使用系统的BLock方法加上__weak和__strong的使用
    3. 给UISCrollView加上图片时,每一张图片的x方向位移是初始偏移量加上图片下标*UISCrollView的宽度

      • CGRectMake(初始偏移量+i*(bounds.size.width),0,bounds.size.width-2*初始偏移量,bounds.size.height)
        
    4. 定时器的使用需要及时的删除/添加,同时注意创建定时器的方式

      • 使用timerwithInterval创建的定时器不会自动添加到RunLoop中,需要手动开启RunLoop

        [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
        [[NSRunLoop mainRunLoop] addTimer:timer forMode: UITrackingRunLoopMode];
        //或者直接添加到NSRunLoopCommonModes中
        [[NSRunLoop mainRunLoop] addTimer:timer forMode: NSRunLoopCommonModes];
        
      • 通过timerWithTimeInterval和initWithFireDate方法创建出来的定时器,都需要手动加入到RunLoop中才会执行,否则不会执行;但是通过scheduledTimerWithTimeInterval创建出来的定时器是自动加入到RunLoop,而且会自动执行

      • 当用户拖动UIScrollView时需要及时的移除定时器,停止拖动时需要及时的加上定时器

        //这里可以设置两个函数,addTimer,removeTimer
        -(void)addTimer{
          __weak typeof(self) weakSelf = self;
          self.bannerTimer = [NSTimer timerWithTimeInterval:3.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
            __strong typeof(weakSelf) strongSelf = weakSelf;
            [strongSelf changePage];
          }];
          [[NSRunLoop mainRunLoop]addTimer:self.bannerTimer forMode:NSDefaultRunLoopMode];
        }
        -(void)removeTimer{
          [self.bannerTimer invalidate];
          self.bannerTimer = nil;
        }
        //scrollview即将开始被拖动
        - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
            [self removeTimer];
        }
        //scrollview即将停止拖动
        - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
            [self addTimer];
        }
        

    iOS中的系统目录

    1. 获取当前应用程序的根目录

      • NSString* homePath = NSHomeDirectory()
        
    2. 获取应用程序的几个主要目录

      • Documents

        • 保存用户创建的文档文件的目录,用户可以通过文件分享分享该目录下的文件,在iTunes和iCloud备份时会自动备份该目录

        • //NSSearchPathForDirectoriesInDomains返回的是一个字符串数组,但是数组里面只有一个元素
          NSString* docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
          
      • Library

        • 不建议在该目录下保存任何用户相关数据,而是保存APP运行需要的修改数据,用户也可以根据自己的需要进行保存
        • Caches
          • 建议保存数据缓存使用,在用户的磁盘空间已经使用完毕时可能删除该目录中的文件,在APP试用期间不会被删除,但是在APP没有运行的时候系统可能会删除,需要持久化的数据不建议保存在该目录下,防止被系统删除
        • preferences
          • 用户偏好存储目录,使用NSUserDefaults或者CFPreferences接口保存的数据都保存在该目录下,编程人员不需要对该目录进行管理,iTunes和iCloud会自动对该目录进行备份
        • Application State
          • 用来保存与用户数据以外的所有文件,如游戏的新关卡,iTunes和iCloud会自动备份该目录
      • tmp

        • 该目录用来保存临时使用的数据,编程人员应该在数据长时间不使用时主动删除该目录下的文件,在APP不运行期间,系统可能删除该目录下的文件,iTunes和iCloud不会备份该目录的文件
      • SystemData(暂无介绍)

    3. 综上所述,我们保存数据可以保存在Documents、Application State目录下,而preferences用于保存系统接口数据不建议使用,而tmp目录和cache目录中的内容可能会被系统磁盘压力紧张时删除

    关于Runloop的一些知识点

    1. RunLoop是什么?

      • RunLoop是一种事件循环,一般的while循环会导致CPU进入忙等状态,而RunLoop则是一种闲等待,当没有事件时,RunLoop会进入休眠状态,当有事件时,Runloop回去寻找相应的Handler处理事件,Runloop可以让线程在需要做事的时候忙起来,在不需要的时候进入休眠状态

        do{
          //获取消息
          //处理消息
        }while(消息!=退出)
        
      • 一个Runloop对象,包含了一个线程,若干个mode,还有当前运行的mode

      • Runloop和线程是绑定在一起的,每个线程都有一个对应的Runloop对象,我们不能自己创建Runloop对象,但是可以获取到系统提供的Runloop对象

      • 主线程的Runloop会在系统启动时完成启动,其他线程的Runloop默认并不会启动,需要我们手动启动

    2. RunLoop Mode

      • Mode可以视为事件的管家,一个Mode管理着各种事件
      • Mode实际上是source,observer,timer的集合,不同的Mode把不同组的source,observer,timer隔绝开,Runloop在某个时刻只能运行在一个Mode下,处理这一个Mode下的source,observer,timer
      • 苹果文档中提到的Mode共有五个
        • NSDefaultRunLoopMode
        • NSConnectionReplyMode
        • NSModePanelRunLoopMode
        • NSEventTrackingRunLoopMode
        • NSRunLoopCommonModes
        • 但是公开暴露出来接口的只有NSDefaultRunLoopMode和NSRunLoopCommonModes
      • NSRunLoopCommonModes是一个Mode的集合,包含了NSDefaultRunLoopMode和NSEventTrackingRunLoopMode,并不是说RunLoop会运行在这两种模式下,而是相当于分别注册了default和eventtracking两种模式。
    3. RunLoop Source

      • RunLoopSource分为source,timer,observer三种,它们被称作ModeItem
    4. 获取RunLoop

      • //获取当前线程的RunLoop,子线程的RunLoop要在子线程获取
        +(NSRunLoop*)currentRunLoop;
        //获取主线程的RunLoop
        +(NSRunLoop*)mainRunLoop;
        
  • 相关阅读:
    【HTML5 绘图与动画】使用canvas
    【H5新增元素和文档结构】新的全局属性 1. contentEditable 可编辑内容 2. contextmenu 快捷菜单 3. data 自定义属性 4. draggable 可拖动 5. dropzone 拖动数据 6. hidden 隐藏 7. spellcheck 语法检查 8. translate 可翻译
    【H5新增元素和文档结构】完善旧元素 1. a 超链接 2. ol 有序列表 3. dl 定义列表 4. cite 引用文本 5. small 小号字体 6. iframe 浮动框架 7. script 脚本
    【H5新增元素和文档结构】新的语义信息 1. address 2. time 3. figure 跟 figcaption 4. details 和 summary 5. mark 6. progress 7. meter 8. dialog 9.bdi 10. wbr 11. ruby、rt、rp 12. command
    【H5新增元素跟文档结构】新的文档结构 1. article 文章块 2. section 区块 3. nav 导航条 4. aside 辅助栏 5. main 主要区域 6. header 标题栏 7. hgroup 标题组 8. footer 页脚栏
    5_PHP数组_3_数组处理函数及其应用_9_数组集合运算函数
    【华为云技术分享】鲲鹏弹性云服务器GCC交叉编译环境搭建指南
    【华为云技术分享】7 分钟全面了解位运算
    【华为云技术分享】Linux内核编程环境 (1)
    【华为云技术分享】华为云MySQL 8.0正式商用,全新增强版开源利器强势来袭
  • 原文地址:https://www.cnblogs.com/chenprice/p/12905749.html
Copyright © 2020-2023  润新知