2010-09-21 7 views
0

J'utilise la classe AsyncSocket pour une application de discussion. Mais je veux utiliser l'instance AsyncSocket créant dans la page de connexion pour l'ensemble du projet. Cela signifie que je veux réutiliser l'instance d'AsyncSocket créée dans la page de connexion de la classe chatViewControl. Quelqu'un peut-il m'aider à trouver une solution pour cela?Comment déclarer une instance AsyncSocket en tant que Global

+0

Vous devriez vraiment éviter état global. Passez simplement l'instance 'AsyncSocket' aux autres objets qui en ont besoin. Lire à propos de l'injection de dépendance: http://en.wikipedia.org/wiki/Dependency_injection – Sven

Répondre

-1

Vous devriez vraiment éviter l'état global lorsque cela est possible (voir le lien de Sven). En général, vous êtes probablement mieux d'avoir une sorte d'objet que vous passez à vos autres objets. Par exemple, l'application actuelle sur laquelle je travaille a un objet ServerInfo que je crée avant de me connecter et de passer à chaque nouveau contrôleur de vue lorsque je le crée, et il contient le socket, les informations de cryptage, l'ID de message actuel , nom d'utilisateur, etc.

Cependant, pour répondre à la question de savoir comment déclarer comme globale, vous pouvez le faire comme dans C:

dans login.h:

extern AsyncSocket *g_socket; 

dans login.m:

AsyncSocket *g_socket; 

puis lorsque vous créez la prise:

g_socket = [[AsyncSocket alloc] init]; 

et quand vous voulez l'utiliser dans d'autres fichiers:

#import "login.h" 

... 

[g_socket sendData:...]; 
+0

On devrait vraiment éviter l'état global, donc ce n'est pas une bonne idée. Il y a une raison pour laquelle cela n'est pas fait très souvent. – Sven

+0

C'était mon intention, mais je suppose que je ne l'ai pas bien transmise - j'ai réordonné/reformulé ma réponse pour que ce soit plus clair. – JosephH

2

Si vous souhaitez avoir une référence à l'échelle application à un seul AsyncSocket, vous pourriez envisager de le déclarer comme une propriété de votre application delegate. Vous pouvez le faire le long des lignes suivantes:

// SampleAppDelegate.h 
#import <Foundation/Foundation.h> 

@class AsyncSocket; 

@interface SampleAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    AsyncSocket *socket; 
} 

@property (nonatomic,retain) AsyncSocket *socket; 

// SampleAppDelegate.m 
#import <SampleAppDelegate.h> 
#import <AsyncSocket.h> 

@implementation SampleAppDelegate 

@synthesize socket; 

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    [window addSubview:[splitViewController view]]; 
    [window makeKeyAndVisible]; 
    self.socket = [[AsyncSocket alloc] init]; // I can't remember this off the top of my head! 
} 

A partir de ce point vous pouvez accéder à votre prise en faisant simplement:

AsyncSocket *socket = [UIApplication sharedApplication] delegate] socket]; 
+0

J'ai essayé votre suggestion en plaçant le socket dans AppDelegate mais lorsque j'ai essayé d'accéder à partir d'autres contrôleurs de vue, l'appel de la méthode de socket ne sort pas -> délégué [UIApplication sharedApplication]]. J'utilise CocoaAsyncSocket: https://github.com/robbiehanson/CocoaAsyncSocket Une idée? – Eddy

Questions connexes