2012-07-18 35 views
1

我有一个ViewController,我从另一个类(TCP类)调用一个方法,在那里我建立到服务器的TCP连接,给了我一个响应。我想,当那个TCP类获得来自服务器的响应时,从ViewController调用另一个方法。从另一个类调用方法,而不重新初始化

问题:

  1. 我是小白。
  2. 我正在初始化并在TCP上分配第一个 Viewcontroller,并且所有的变量都被重置(我不想要的东西 )。

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

Tks!

回答

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 

希望帮助!

+0

Tks很多人。所以我必须让我的ViewController成为TCP类的观察者。这意味着来自TCP类的所有方法都可以从VC访问? – 88fsantos 2012-07-18 19:24:03

+0

使用观察者模式,您正在定义一个接口并保证所有观察者都具有此接口。传统上这是一个notify()方法。当通知被调用时,你可以调用你需要的任何函数。这允许视图控制器在来自TCP连接的回调中被事件驱动。您当然也可以通过TCP类指向ViewController的指针,然后在获得回调后调用ViewController上的特定函数,但Observer模式更清晰,可以更好地扩展(您可以将它用于所有视图控制器)并松散地再加。 – Kibitz503 2012-07-18 19:27:20

+1

所以要更直接地回答你的问题......不能。它将能够看到所有的TCP类公共方法。 (我假设视图控制器正在创建TCP类)订阅和取消订阅的方法需要公开才能使用它们。 – Kibitz503 2012-07-18 19:51:52