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 
4

2 に答える 2

1

このシングルトンとそれに関連付けられた接続を使用するには、getInstanceメソッドを呼び出して、使用しようとしている接続への参照を取得するだけです。通常のalloc/initプロセスの代わりに、これを効果的に実行します。各ビューからgetInstanceメソッドを使用できます。これらのビューはすべて、意図したとおりに同じ接続を維持します。

また、シングルトンを作成する方法のため、getInstanceの代わりにalloc / initを呼び出すと、前の接続を使用する代わりに新しい接続が作成されます。

ビュー内に参照を作成するためにこれを行う方法の例は次のとおりです。

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

これに似たコードを使用すると、すべてのビューで同じ接続が使用されますが、接続を使用しているビューが画面に表示されるまで、接続は作成されません。アプリケーションの起動時に接続を作成するには、これと同じ「getInstance」をappDelegateメソッドの1つに追加します。

また、シングルトンを使用していて、この変数が実際に解放されることはないため、サーバーへの接続を再初期化、削除、および一般的に管理するためのメソッドの追加を検討することをお勧めします。

于 2012-06-04T14:12:19.290 に答える
0

おそらくUIApplicationDelegateメソッドで初期化を実行します

- (void)applicationDidFinishLaunching:(UIApplication *)application

このようにして、接続が開始および開始され、ViewsまたはViewControllerが前面に表示されるか、アクティブになる前に初期化を実行できます。

于 2012-06-04T14:18:19.320 に答える