一个Object中的更改应该影响同一个类的其他对象

时间:2013-03-20 10:04:02

标签: ios design-patterns delegates singleton customization

目前我正在开发一个iOS项目。其中我有两个视觉上相似的对象派生自同一个类。我想要的是当我对一个需要在对象2中更改相同的对象进行一些更改时。

详细信息:

我有一个班级MyClassobj1obj2来自MyClass。当我在obj1上执行某些操作时,它会调用相应的obj1委托方法。现在我想要的是当obj1调用它的委托方法时,我还需要调用obj2的委托方法。同样如果:如果我更改obj2,则会影响obj1。此外,我还需要在将来添加更多元素。

我做了什么:

我添加了一个Singleton类并在其上放置了一个数组并将对象添加到该类中。

在委托方法中:

- (void)delegateMethod:(id)param
{
   NSMutableArray *arr = [[MySingleTon sharedObject] getArray];
   for(int loop = 0;loop<[arr count];loop++)
   {
      if(![arr objectAtIndex] == self)
      {
          [[arr objectAtIndex:loop] delegateMethod:param];
      }
   }
}

发生的事情是:

但问题是它会导致无限循环。 Obj2将做同样的事情,所有其他对象做同样的事情。我被困在这里,我有大约25个委托方法,需要实现相同的功能。我无法通过添加额外的参数来更改委托方法。

这有什么解决方案吗?请帮助我,提前谢谢。

为什么我需要这个/实际实施:

我创建了一个可以缩放/旋转等的自定义视图。我创建了两个相同类的对象并将其添加到我的父视图中。现在,当我在视图1上更改任何内容时,它应该更改视图2中的类似内容。此外,我还需要添加更多视图。

2 个答案:

答案 0 :(得分:1)

基本上因为你想让两个不同的对象引用完全相同的状态你应该将这两个对象指向第三个 - 是具有静态的基类或具有静态的第三类或者是单例。这样做的好处是Object1不必了解Object2,这意味着如果你添加了一个Object3,那么你就不必更改你的代码了。

因此,只要您的对象写入共享状态,就可以读取新值。如果您希望对象在该更改上立即更改,那么您将需要实现事件(我假设iOS具有这些事件),以便让Object1和Object2订阅共享状态中的更改。

我不是iOS而是pseduocode ......

abstract class BaseClass {
 protected static sharedArray = new sharedArray();

  void someMethod(int i, int aNewValue) {
   BaseClass.sharedArray[i] = aNewValue;
  }

  int getSharedValue(int i) {
    return BaseClass.sharedArray[i];
  }
}

class ObjectOne extends BaseClass {

}

class ObjectTwo extends BaseClass {

}

请注意这不是线程安全的,有点可怕,但它可能会指向正确的方向。如果你引用的状态是由一个引用的每个对象的单例持有,它会更整洁(但仍然不是线程安全的)

//this isn't written as a singleton
class MySingleton {
    private SharedArray sharedArray = new sharedArray();

    void someMethod(int i, int aNewValue) {
       BaseClass.sharedArray[i] = aNewValue;
    }

    int getSharedValue(int i) {
       return BaseClass.sharedArray[i];
    }
}

class ObjectOne extends MyCustomViewObjectThing {
     private MySingleton mySingleton

     void doMyChangeActivity(int i) {
       mySingleton.someMethod(i, i);
     }
}

class ObjectTwo extends MyCustomViewObjectThing {
     private MySingleton mySingleton

     void doMyChangeActivity(int i) {
       mySingleton.someMethod(i, i*2);
     }      
}

我知道这段代码很糟糕,但它只是为了说明我的意思: - )

答案 1 :(得分:0)

你可以做一件事。当您在Object1中进行更改时,您手动调用Object2的委托方法。因此,当您手动调用Object2的委托方法时,您已在该委托方法中有参数,因此在参数列表中添加一个参数,该参数将指示调用此方法的对象。因此,通过使用该参数,如果您的主对象1已更改,并且您正在手动调用Object2的委托方法,并且通过设置条件,您可以解决问题。

希望这会对你有所帮助。

如果你还想要我的帮助,我就在这里。

一切顺利!!!