【问题标题】:Changes in one Object should affect the other objects of same class一个对象的变化应该影响同一类的其他对象
【发布时间】:2013-03-20 10:04:02
【问题描述】:

目前我正在开发一个 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 中的类似内容。我还需要添加更多视图。

【问题讨论】:

    标签: ios design-patterns delegates singleton customization


    【解决方案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);
         }      
    }
    

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

    【讨论】:

      【解决方案2】:

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

      希望这会对你有所帮助。

      如果你还需要任何帮助,我在这里。

      一切顺利!!!

      【讨论】:

      • 我从哪里调用其他对象的委托方法?此外,将来我将添加更多相同类的对象。然后就很难处理了(添加单独的调用)。
      猜你喜欢
      • 1970-01-01
      • 2016-07-15
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 2016-11-30
      • 2013-08-06
      • 1970-01-01
      相关资源
      最近更新 更多