1

我有 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);
                   }
                });
            }
        });

    }
}

这味道太难闻了,我无法呼吸。数据绑定的概念完全被这种计算隐藏在一个单独的线程方法中。

我考虑过将ComputedSetforz与自定义领域一起使用(使用适当的 asyncExec),但没有简单的方法可以从那里访问xy值。x并且y可以绑定到自定义领域内的代理,但这会重复内存使用,并且可能会通过额外的事件处理污染模型线程。

是否有一种聪明的方法可以从自定义领域获取值xy计算z可观察值的值?

4

0 回答 0