05-多线程(3)

2017-02-10  本文已影响8人  cdd48b9d36e0

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与线程
    - (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;

上一篇下一篇

猜你喜欢

热点阅读