2010-09-21 4 views
0

Я использую класс AsyncSocket для приложения чата. Но я хочу использовать экземпляр AsyncSocket, созданный на странице входа для всего проекта. Это означает, что я хочу повторно использовать экземпляр AsyncSocket, созданный на странице входа в класс chatViewControl. Может ли кто-нибудь помочь мне найти решение?Как объявить экземпляр AsyncSocket глобальным

+0

Вы действительно должны избегать глобального состояния. Просто передайте экземпляр «AsyncSocket» другим объектам, которые в нем нуждаются. Читайте об инъекции зависимостей: http://en.wikipedia.org/wiki/Dependency_injection – Sven

ответ

-1

Вы должны действительно избегать глобального состояния, где это возможно (см. Ссылку Свена). В общем, вы, вероятно, лучше иметь какой-то объект, который вы передаете другим объектам.

Например, текущее приложение, над которым я работаю У меня есть объект ServerInfo, который я создаю перед входом в систему и передаю каждому новому контроллеру представления при его создании, и он содержит сокет, информацию о шифровании, текущий идентификатор сообщения , имя пользователя и т.д.

Однако, чтобы ответить на вопрос о том, как объявить его как глобальный, вы можете сделать это так же, как в C:

в login.h:

extern AsyncSocket *g_socket; 

в login.m:

AsyncSocket *g_socket; 

то при создании сокета:

g_socket = [[AsyncSocket alloc] init]; 

и когда вы хотите использовать его в других файлах:

#import "login.h" 

... 

[g_socket sendData:...]; 
+0

На самом деле нужно избегать глобального состояния, поэтому это не очень хорошая идея. Есть причина, почему это не делается очень часто. – Sven

+0

Это было мое намерение, но я думаю, что я не передал это хорошо - я переупорядочил/пересмотрел свой ответ, чтобы сделать это более ясным. – JosephH

2

Если вы хотите иметь приложения широкое указания на single AsyncSocket, вы можете рассмотреть это как свойство вашего application delegate. Вы можете сделать это по следующим направлениям:

// 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! 
} 

С этого момента вы можете получить доступ к сокет просто делать:

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

Пробовал ваше предложение, поместив сокет внутри AppDelegate, но когда я попытался получить доступ с других контроллеров представлений, вызов метода сокета не выйдет -> [UIApplication sharedApplication] delegate]. Я использую CocoaAsyncSocket: https://github.com/robbiehanson/CocoaAsyncSocket Любая идея? – Eddy