面试题答案
一键面试缓存策略
- iOS:
- 利用NSURLCache,它提供了对HTTP和HTTPS请求的响应进行缓存的功能。例如,可以设置如下代码来配置缓存:
let cache = NSURLCache(memoryCapacity: 10 * 1024 * 1024, diskCapacity: 50 * 1024 * 1024, diskPath: "myCache")
NSURLCache.setSharedURLCache(cache)
在Flutter中使用http
库时,可配合io
库中与iOS原生交互的方式来间接使用上述缓存机制。
- 对于图片请求,iOS原生的SDWebImage
库有很好的缓存策略,在Flutter的flutter_image
等相关插件中,有些会底层调用iOS原生的图片缓存逻辑,以优化图片网络请求。
- Android:
- 使用OkHttp的缓存功能,OkHttp默认支持HTTP缓存。可以通过如下代码配置:
File httpCacheDirectory = new File(context.getCacheDir(), "responses");
int cacheSize = 10 * 1024 * 1024; // 10 MiB
Cache cache = new Cache(httpCacheDirectory, cacheSize);
OkHttpClient client = new OkHttpClient.Builder()
.cache(cache)
.build();
在Flutter项目中,如果使用http
库,其底层也是基于OkHttp,可直接受益于上述缓存配置。
- 对于Glide图片加载框架,在Android平台广泛使用,它有强大的图片缓存策略,在Flutter的flutter_image
相关插件中,有些会利用Glide来实现图片加载与缓存优化。
请求并发控制
- iOS:
- 使用NSOperationQueue来控制并发请求数量。例如,创建一个最大并发数为3的队列:
let operationQueue = NSOperationQueue()
operationQueue.maxConcurrentOperationCount = 3
let request1 = NSURLRequest(url: URL(string: "url1")!)
let request2 = NSURLRequest(url: URL(string: "url2")!)
let request3 = NSURLRequest(url: URL(string: "url3")!)
let dataTask1 = URLSession.shared.dataTask(with: request1)
let dataTask2 = URLSession.shared.dataTask(with: request2)
let dataTask3 = URLSession.shared.dataTask(with: request3)
operationQueue.addOperation(dataTask1)
operationQueue.addOperation(dataTask2)
operationQueue.addOperation(dataTask3)
在Flutter中,可以通过platform_channel
来与iOS原生代码交互,从而实现类似的并发控制。
- Android:
- 使用OkHttp的Dispatcher来控制并发请求。例如,设置最大并发请求数为2:
OkHttpClient client = new OkHttpClient.Builder()
.dispatcher(new Dispatcher().setMaxRequests(2))
.build();
在Flutter项目中,由于http
库底层基于OkHttp,在合适的场景下可以通过自定义HttpClient来实现对并发请求的控制。