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

问题描述 投票:0回答:2

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

详细:

我有一个类

MyClass
obj1
obj2
源自
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 中的类似内容。此外,我还需要添加更多视图。

ios design-patterns delegates singleton customization
2个回答
1
投票

基本上,因为您希望两个不同的对象引用完全相同的状态,所以您应该将这两个对象指向第三个对象 - 无论是具有静态状态的基类还是具有静态状态的第三种类型,或者是单例。这样做的好处是,Object1 不必了解 Object2,这意味着如果您添加了 Object3,则无需更改代码。

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

我不使用 iOS,但使用伪代码...

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

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


0
投票
你可以做一件事。当您在 Object1 中进行更改时,您可以手动调用 Object2 的委托方法。因此,当您手动调用 Object2 的委托方法时,您在该委托方法中已经有了参数,因此在您的参数列表中再添加一个参数,该参数将指示从哪个对象调用此方法。

因此,通过使用该参数,如果您的主对象 1 发生更改并且您手动调用对象 2 的委托方法,并通过设置条件,您可以摆脱问题。

© www.soinside.com 2019 - 2024. All rights reserved.