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管理第三方框架)
- 更换为cocoapods的源为国内的淘宝源
- 更新gem
- 安装pod
- 更换repo镜像为国内服务器(仓库)
- 初始化三方库信息(pod setup)
- 初始化完了可以搜索验证(pod search)
- 以后更新三方库信息(pod repo update)
- 下面就可以在一个项目中使用cocoapods了
3、RunLoop(04-runloop01-简介)
- 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;
}
}
- 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]);
}
- 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;
网友评论