【问题标题】:Invoke a method from another class, without reinitializing it从另一个类调用方法,而不重新初始化它
【发布时间】:2012-07-17 21:57:43
【问题描述】:

我有一个 ViewController,我在其中调用另一个类(TCP 类)的方法,在那里我与服务器建立 TCP 连接,这给了我一个响应。我想,当那个 TCP 类从服务器获取响应时,从 ViewController 调用另一个方法。

问题:

  1. 我是菜鸟。
  2. 我首先初始化并分配它 TCP上的Viewcontroller,我所有的变量都被重置了(东西 我不想要的)。

那么...我能做些什么来使它正确?我只想从另一个类中调用一个方法,该类已经分配在内存中。

谢谢!

【问题讨论】:

    标签: xcode cocoa class methods public-method


    【解决方案1】:

    您可以将 ViewController 设置为 TCP 类的观察者。这是一个解释 Obj-C 中观察者模式实现的链接。 (与我使用的非常相似,但写得很好。)

    http://www.a-coding.com/2010/10/observer-pattern-in-objective-c.html

    我通常也喜欢将持久层与接口分开。我使用观察者或 KVO 来通知我的业务逻辑和视图控制器发生了一些变化。

    如果您愿意,也可以通过提供的通知中心发送信息...

    https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

    基本代码示例:

    @implementation ExampleViewController
    //...
    - (void)viewDidLoad
    {
       [super viewDidLoad:animated];
       [TCPClass subscribeObserver:self];
    }
    - (void)viewDidUnload
    {
       [super viewDidUnload:animated];
       [TCPClass unsubscribeObserver:self];
    }
    - (void)notifySuccess:(NSString*)input
    {
       //Do whatever I needed to do on success
    }
    //...
    @end
    
    @implementation TCPClass
    //...
    //Call this function when your TCP class gets its callback saying its done
    - (void)notifySuccess:(NSString*)input 
    {    
        for( id<Observer> observer in [NSMutableArray arrayWithArray:observerList] )
        {
            [(NSObject*)observer performSelectorOnMainThread:@selector(notifySuccess:)   withObject:input waitUntilDone:YES];
        }
    }
    //maintain a list of classes that observe this one
    - (void)subscribeObserver:(id<Observer>)input {
        @synchronized(observerList) 
        {
            if ([observerList indexOfObject:input] == NSNotFound) {
            [observerList addObject:input];
            }
        }
    }
    
    - (void)unsubscribeObserver:(id<Observer>)input {
        @synchronized(observerList) 
        {
            [observerList removeObject:input];
        }
    }
    //...
    @end
    
    //Observer.h
    //all observers must inherit this interface
    @protocol Observer
    - (void)notifySuccess:(NSString*)input;
    @end
    

    希望有帮助!

    【讨论】:

    • Tks 很多人。所以我必须让我的 ViewController 作为 TCP 类的观察者。这意味着来自 TCP 类的所有方法都可以从 VC 访问?
    • 使用观察者模式,您定义了一个接口并保证所有观察者都将拥有这个接口。传统上这是一个 notify() 方法。当 notify 被调用时,你会调用你需要的任何函数。这允许视图控制器在来自 TCP 连接的回调上被事件驱动。当然,您也可以向 TCP 类传递一个指向 ViewController 的指针,然后在获得回调后调用 ViewController 上的特定函数,但是 Observer 模式更清晰,可伸缩性更好(您可以将它用于所有视图控制器)并且松散耦合。
    • 所以要更直接地回答您的问题...不。不过,它将能够看到所有 TCP 类的公共方法。 (我假设视图控制器正在创建 TCP 类)订阅和取消订阅的方法需要公开才能使用它们。
    • 在 TCP 类中放置函数 subscribeObserver 然后确保将原型放在 .h 文件中。您可能需要仔细检查我的拼写。您也可以随意重命名这些函数。
    • 好吧,我了解了更多东西并了解了我的工作方式,现在它可以工作了!非常感谢您的帮助!
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 2018-12-19
    • 2013-12-28
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    相关资源
    最近更新 更多