我有 observablesx
并且y
在 SWT 领域内。我想使用它们的值来计算IObservableList
z
. 计算不能在 UI 线程中完成,所以我必须写:
class Computer {
private final IObservableSet x;
private final IObservableList y;
private final WritableList z = new WritableList();
Computer(IObservableSet x, IObservableList y) {
this.x = x;
this.y = y;
x.addSetChangeListener(new ISetChangeListener() {
public void handleSetChange(SetChangeEvent event) {
update();
}
};
y.addSetChangeListener(new IListChangeListener() {
public void handleListChange(ListChangeEvent event) {
update();
}
};
}
void update() {
Set xData = new HashSet(x);
List yData = new HashList(y);
// Calculation is to be done in a different thread and within special context
Model.getTransactionManager().asyncExec(new Runnable() {
void run() {
List zData = numberCruncher(xData, yData);
//can't assign to SWT reaml directly
z.getRealm().asyncExec(new Runnable() {
void run() {
z.clear();
z.addAll(zData);
}
});
}
});
}
}
这味道太难闻了,我无法呼吸。数据绑定的概念完全被这种计算隐藏在一个单独的线程方法中。
我考虑过将ComputedSet
forz
与自定义领域一起使用(使用适当的 asyncExec),但没有简单的方法可以从那里访问x
和y
值。x
并且y
可以绑定到自定义领域内的代理,但这会重复内存使用,并且可能会通过额外的事件处理污染模型线程。
是否有一种聪明的方法可以从自定义领域获取值x
来y
计算z
可观察值的值?