面试题答案
一键面试使用缓存版本控制
- 原理:
- 为缓存数据设置一个版本号。当数据发生变化时,更新版本号。每次加载数据时,先检查本地缓存的版本号与服务器端(或数据源)的版本号是否一致。如果不一致,说明数据已更新,需要重新加载数据并更新缓存。
- 示例代码:
class DataCache {
int _version = 0;
dynamic _cachedData;
Future<dynamic> fetchData() async {
// 模拟从服务器获取数据和版本号
int serverVersion = await _getServerVersion();
dynamic serverData = await _getServerData();
if (serverVersion > _version) {
_version = serverVersion;
_cachedData = serverData;
return serverData;
} else {
return _cachedData;
}
}
Future<int> _getServerVersion() async {
// 实际实现从服务器获取版本号
return Future.delayed(const Duration(seconds: 1), () => 1);
}
Future<dynamic> _getServerData() async {
// 实际实现从服务器获取数据
return Future.delayed(const Duration(seconds: 1), () => {'key': 'value'});
}
}
使用事件驱动机制
- 原理:
- 利用事件总线(Event Bus),当数据发生变化时,发布一个事件。订阅了该事件的组件或服务收到事件后,更新缓存数据。这样可以解耦数据更新的触发和缓存更新的逻辑。
- 示例代码:
import 'package:event_bus/event_bus.dart';
final EventBus eventBus = EventBus();
class DataUpdatedEvent {}
class DataCache {
dynamic _cachedData;
DataCache() {
eventBus.on<DataUpdatedEvent>().listen((event) {
_updateCache();
});
}
Future<dynamic> fetchData() async {
if (_cachedData == null) {
await _updateCache();
}
return _cachedData;
}
Future<void> _updateCache() async {
// 模拟从服务器获取数据
_cachedData = await _getServerData();
}
Future<dynamic> _getServerData() async {
// 实际实现从服务器获取数据
return Future.delayed(const Duration(seconds: 1), () => {'key': 'value'});
}
}
// 数据更新时发布事件
void updateData() {
eventBus.fire(DataUpdatedEvent());
}
在上述示例中,缓存版本控制通过比较版本号来决定是否更新缓存,而事件驱动机制通过事件总线发布和监听事件来触发缓存更新。两者都能在数据变化时优雅地更新缓存数据以保证一致性。