zoukankan      html  css  js  c++  java
  • 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;
        
  • 相关阅读:
    在redhat 6.6上安装Docker
    Linux操作系统各版本ISO镜像下载(包括oracle linux edhatcentosu
    UML时序图(Sequence Diagram)学习笔记
    eureka 和zookeeper 区别 优势【转】
    HttpClient实现远程调用
    Java 1.8 Stream 用例测试
    ZooKeeper下载安装(Windows版本)
    Java1.8新特性
    mysql大数据量表索引与非索引对比
    druid监控mysql程序
  • 原文地址:https://www.cnblogs.com/chenprice/p/12905749.html
Copyright © 2011-2022 走看看