2012-06-04 91 views
0

我創建了一個單例類,它的任務是創建一個tcp套接字連接,並在應用程序運行時保持其無限打開狀態。我相信我的單例類看起來應該是這樣的(在其他StackOverflow問題的幫助下讓我到那裏),但我的問題是,我不知道何時或如何調用我的類對象。我對iOS開發還很陌生,所以這對我來說是非常陌生的。調用單例類來保持套接字連接打開

  • 我的應用程序有多個視圖
  • 我想用我的單身類來創建一個TCP套接字連接並保持連接在任何時候都
  • 我不知道在哪裏調用/調用我的單例類對象
  • 我不知道該怎麼稱呼/調用我的單身類對象
  • 我使用SmallSockets庫

這裏是我的類文件:

SocketConnection.h

#import <Foundation/Foundation.h> 

@interface SocketConnection : NSObject 
{ 

} 

+ (SocketConnection *)getInstance; 

@end 

SocketConnection.m

#import "SocketConnection.h" 
#import "imports.h" 

static SocketConnection *sharedInstance = nil; 

@implementation SocketConnection 

- (id)init 
{ 
    self = [super init]; 

    if (self) 
    { 
     while(1) 
     { 
      Socket *socket; 
      int port = 11005; 
      NSString *host = @"199.5.83.63"; 

      socket = [Socket socket]; 

      @try 
      { 
       NSMutableData *data; 
       [socket connectToHostName:host port:port]; 
       [socket readData:data]; 
       // [socket writeString:@"Hello World!"]; 

       // Connection was successful // 
       [socket retain]; // Must retain if want to use out of this action block. 
      } 
      @catch (NSException* exception) 
      { 
       NSString *errMsg = [NSString stringWithFormat:@"%@",[exception reason]]; 
       NSLog(errMsg); 
       socket = nil; 
      } 
     } 
    } 
    return self; 
} 

+ (SocketConnection *)getInstance 
{ 
    @synchronized(self) 
    { 
     if (sharedInstance == nil) 
     { 
      sharedInstance = [[SocketConnection alloc] init]; 
     } 
    } 
    return sharedInstance; 
} 

@end 

回答

1

要使用此辛格爾頓,以及與之相關聯的連接,你可以簡單地調用getInstance方法來獲得一個參考到您嘗試使用的連接。你會有效地做到這一點,而不是典型的alloc/init進程。您可以在每個視圖中使用getInstance方法,並且它們都將保持與您打算的相同的連接。另外,因爲你創建Singleton的方式,如果你調用alloc/init而不是getInstance,你將創建一個新的連接,而不是使用前一個。

的你怎麼可能這樣做是爲了創建一個視圖中的引用的一個例子是:

@property (strong, nonatomic) SocketConnection * connection 
-(void) awakeFromNib 
{ 
    connection = [SocketConnection getInstance]; 
} 

類似的代碼,這將導致所有的你的意見,使用相同的連接,但不會建立連接,直到您在屏幕上顯示使用連接的視圖。要在應用程序啓動時創建連接,請將相同的'getInstance'添加到您的一個appDelegate方法中。另外,由於您使用的是單例,並且此變量從未真正釋放,因此您可能需要考慮添加方法以重新初始化,刪除並通常管理與服務器的連接。

+0

也同意你的評論,他實施getInstance方法的方式將基本上在第一次NEED時正確地初始化singlton。 – trumpetlicks

+0

你介意用代碼示例來詳細說明嗎?這聽起來像我應該去的方式,但我不知道我明白代碼的樣子。我會很感激我能得到的任何幫助。謝謝! – Skizz

+0

@Skizz更新答案以提供所需的詳細信息。 – heckman

0

我可能會在UIApplication的委託方法

- (void)applicationDidFinishLaunching:(UIApplication *)application 

執行初始化這種方式啓動連接,並開始和您可以在任何您的意見或視圖控制器來前或活躍的之前執行初始化。