美文网首页
05-多线程(3)

05-多线程(3)

作者: cdd48b9d36e0 | 来源:发表于2017-02-10 01:02 被阅读8次

    0710SDWebImage和RunLoop

    1、SDWebImage常用API(02-sdwebimage)

    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.icon] placeholderImage:[UIImage imageNamed:@"placeholder"]];
    
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.icon] placeholderImage:[UIImage imageNamed:@"placeholder"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
            // expectedSize: 图片的总字节数
            // receivedSize: 已经接收的图片字节数
            
            NSLog(@"下载进度:%f", 1.0 * receivedSize / expectedSize);
        } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
            NSLog(@"下载完图片");
        }];
    
    //纯下载图片,可以给其他控件设置图片
        [[SDWebImageManager sharedManager] downloadImageWithURL:nil options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
            
        } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
            
        }];
    
    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
    {
        // 清除内存缓存
        [[SDWebImageManager sharedManager].imageCache clearMemory];
        // 取消所有下载
        [[SDWebImageManager sharedManager] cancelAll];
    }
    

    2、安装cocoapods步骤(03-使用cocoapods管理第三方框架)

    1. 更换为cocoapods的源为国内的淘宝源
    2. 更新gem
    3. 安装pod
    4. 更换repo镜像为国内服务器(仓库)
    5. 初始化三方库信息(pod setup)
    6. 初始化完了可以搜索验证(pod search)
    7. 以后更新三方库信息(pod repo update)
    8. 下面就可以在一个项目中使用cocoapods了

    3、RunLoop(04-runloop01-简介)

    1. RunLoop就是运行循环(do-while循环)(注意,Runloop并不是一直都在不停的转,当没事干的时候会休眠,有事的时候才会转起来)
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            
            NSLog(@"1111");
            //这个UIApplicationMain内部就是开启了一个运行循环,可以看到1111打印后2222在程序运行期间永远不会打印
            //这个默认启动的RunLoop是跟主线程相关联的
            int result = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
            NSLog(@"22222");
            return result;
        }
    }
    
    1. RunLoop与线程
    • 每条线程都有唯一的一个与之对应的RunLoop对象
    • 主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建
    • RunLoop在第一次获取时创建,在线程结束时销毁
        - (void)viewDidLoad {
        [super viewDidLoad]; 
        NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
        [thread start];
    }
        - (void)run
    {
        //说明:
        //子线程RunLoop默认是没有开启的,需要手动开启
       //创建方法就是[NSRunLoop currentRunLoop],因为它是懒加载(此时只是创建了,并没有跑起来)
       //runloop在程序里是以字典形式保存的,key是线程,value就是runloop
        NSLog(@"-----run--%p", [NSRunLoop currentRunLoop]); 
    }
    
    1. Runloop相关类


    关于Timer的说明:

    NSRunLoopCommonModes是个模式的标记,并非真正的Mode,真正的Mode只有前四个。比如,我们常用的[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];这个API已经在内部把定时器加入到运行循环,这一句等价于下面两句NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];但是定时器只运行在NSDefaultRunLoopMode下,一旦RunLoop进入其他模式(比如拖拽tableview),这个定时器就不会工作,此时若改为[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];就可以在tableview滑动的时候也工作了,而且是在kCFRunLoopDefaultMode和UITrackingRunLoopMode两种模式下的运行循环都能工作。
    那么他的背后是怎么实现的呢?加入一个运行循环默认不是只能加入一种吗?其实是这样的,NSRunLoopCommonModes是一种标记,把[NSRunLoop currentRunLoop]打印出来就能看到kCFRunLoopDefaultMode和UITrackingRunLoopMode这两种模式是被标记为NSRunLoopCommonModes了的,这就是定时器能工作在两种模式下的原因
    与此类似的另一个用于动画的定时器CADisplayLink也有个加入runloop的API:-(void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSRunLoopMode)mode;

    相关文章

      网友评论

          本文标题:05-多线程(3)

          本文链接:https://www.haomeiwen.com/subject/pftgittx.html