面试题答案
一键面试优化策略
- 避免频繁I/O操作
- 批量操作:
- 不要每次写入单个数据就调用
SharedPreferences
的set
方法并提交。而是先将所有需要写入的数据缓存到内存中,比如使用一个Map
来存储。然后一次性调用SharedPreferences
的set
方法,并通过commit
或await putAll
方法提交。
- 不要每次写入单个数据就调用
- 异步操作:
- 使用
SharedPreferences.getInstance()
获取实例时,该方法是异步的。在批量写入时,也应确保写入操作在异步任务中执行,避免阻塞主线程。
- 使用
- 批量操作:
- 处理写入冲突
- 使用锁机制:
- 在Flutter中可以使用
Lock
类(来自package:async/async.dart
)。在进行批量写入操作前,先获取锁,完成写入后释放锁,这样可以避免多个写入操作同时进行导致的冲突。
- 在Flutter中可以使用
- 使用锁机制:
核心代码思路
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:async/async.dart';
final Lock _lock = Lock();
Future<void> batchWrite(Map<String, dynamic> data) async {
await _lock.synchronized(() async {
final prefs = await SharedPreferences.getInstance();
await prefs.addAll(data);
});
}
在调用时,可以这样使用:
void main() async {
Map<String, dynamic> batchData = {
'key1': 'value1',
'key2': 'value2',
// 更多数据
};
await batchWrite(batchData);
runApp(MyApp());
}
上述代码中,batchWrite
函数实现了批量写入并处理可能的写入冲突。先通过_lock.synchronized
获取锁,然后获取SharedPreferences
实例并调用addAll
方法进行批量写入。最后在main
函数中示例了如何调用batchWrite
函数来批量写入数据。