SD源码解读遇见的问题

SD源码解读依据的文章来自:http://www.cocoachina.com/ios/20170511/19252.html

1、GCG,dispatch_barrier_sync 函数

dispatch_sync 同步执行block里面的函数 , dispatch_async 异步执行block里面的函数

dispatch_barrier_async 异步等待 和 dispatch_barrier_sync 同步等待
1 dispatch_barrier_sync(queue,void(^block)()) ,会将queue中barrier前面添加的任务block全部执行后,再执行barrier任务的block,再执行barrier后面添加的任务block
2 dispatch_barrier_async(queue,void(^block)())会将queue中barrier前面添加的任务block只添加不执行,继续添加barrier的block,再添加barrier后面的block,同时不影响主线程(或者操作添加任务的线程)中代码的执行
3

2、NSOperation 和 NSOperationQueue

NSOperation、NSOperationQueue 是苹果提供给我们的一套多线程解决方案。实际上 NSOperation、NSOperationQueue 是基于 GCD 更高一层的封装,完全面向对象。
NSOperation :操作
执行操作的意思,换句话说就是你在线程中执行的那段代码。在 GCD 中是放在 block 中的。在 NSOperation 中,我们使用 NSOperation 子类 NSInvocationOperation、NSBlockOperation,或者自定义子类来封装操作。
NSOperationQueue :操作队列
这里的队列指操作队列,即用来存放操作的队列。NSOperationQueue 对于添加到队列中的操作,首先进入准备就绪的状态(就绪状态取决于操作之间的依赖关系),然后进入就绪状态的操作的开始执行顺序(非结束执行顺序)由操作之间相对的优先级决定(优先级是操作对象自身的属性)。
操作队列通过设置最大并发操作数(maxConcurrentOperationCount)来控制并发、串行(当maxConcurrentOperationCount == 1时候为串行,否则为并行,当为-1时最到并行)。
NSOperationQueue 为我们提供了两种不同类型的队列:主队列和自定义队列。主队列运行在主线程之上,而自定义队列在后台执行。

NSOperation单独使用时是在主线程执行的(主队列)要在子线程执行需要配合NSOperationQueue一同使用。
NSOperation 实现多线程的使用步骤分为三步:

创建操作:先将需要执行的操作封装到一个 NSOperation 对象中。
创建队列:创建 NSOperationQueue 对象。
将操作加入到队列中:将 NSOperation 对象添加到NSOperationQueue 对象中。

3、NSURLCache 使用

NSCache 系统缓存,缓存任意对象的数据
NSURLCache 缓存网络请求数据

4、文件操作和 NSDirectoryEnumerator

NSFileManager
NSDirectoryEnumerator

5、如何判断一个图片的格式是 PNG 还是 JPG

/// 将图片转换成 PNG 二进制数据
UIImagePNGRepresentation([UIImage imageNamed:@"003"]);

/// 将图片转换成 JPEG 二进制数据
UIImageJPEGRepresentation([UIImage imageNamed:@"003"], 0.6);

/// 一个图片的二进制数据(不知道格式的)
NSData *imageData;
NSString *type; /// 图片类型

if (imageData.length > 4) {
    const unsigned char * bytes = [imageData bytes];
    
    if (bytes[0] == 0xff &&
        bytes[1] == 0xd8 &&
        bytes[2] == 0xff)
    {
        type = @"JPEG";
    }
    
    if (bytes[0] == 0x89 &&
        bytes[1] == 0x50 &&
        bytes[2] == 0x4e &&
        bytes[3] == 0x47)
    {
        type = @"PNG";
    }
}

你可能感兴趣的:(SD源码解读遇见的问题)