0

次のようなシングルトンクラスでソケットを保持します。

SocketConnection.h

@interface SocketConnection : NSObject

+ (GCDAsyncSocket *) getInstance;

@end

SocketConnection.m

#define LOCAL_CONNECTION 1

#if LOCAL_CONNECTION
#define HOST @"localhost"
#define PORT 5678
#else
#define HOST @"foo.abc"
#define PORT 5678
#endif

static GCDAsyncSocket *socket;

@implementation SocketConnection

+ (GCDAsyncSocket *)getInstance
{
    @synchronized(self) {
        if (socket == nil) {
            dispatch_queue_t mainQueue = dispatch_get_main_queue();
            socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue];
        }
        if (![socket isConnected]) {

            NSString *host = HOST;
            uint16_t port = PORT;
            NSError *error = nil;

            if (![socket connectToHost:host onPort:port error:&error])
            {
                NSLog(@"Error connecting: %@", error);
            }
        }
    }

    return socket;
}

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
    NSLog(@"socket connected");
}

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
    NSLog(@"socketDidDisconnect:%p withError: %@", sock, err);
}

@end

そしてviewControllerで:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        _socket = [SocketConnection getInstance];
    }
    return self;
}

サーバーにソケットが接続されていることがわかりますが、xcodeコンソールログには何もありません。デリゲートメソッドを呼び出せない理由を理解するのを手伝ってください。

4

1 に答える 1

0

SocketConnection のgetInstanceメソッドでソケットを初期化しています。この時点でデリゲートを に設定しselfます。selfビューコントローラーではなく、SocketConnection インスタンスを参照します。ビュー コントローラーでソケットを初期化するか (この時点でシングルトンではなくなります)、SocketConnection にデリゲート プロパティを作成し、デリゲート メソッドを SocketConnection のデリゲートに渡します。個人的には後者を使用しますが、メッセージを委任するのではなく、通知を送信します。

于 2012-10-09T02:46:04.370 に答える