0

我创建了一个单例类,它的工作是创建一个 tcp 套接字连接并在应用程序运行时使其无限打开。我相信我的单例类看起来应该是这样(在其他 StackOverflow 问题的帮助下让我到达那里),但我的问题是我不知道何时或如何调用我的类对象。我对 iOS 开发还是很陌生,所以这对我来说很陌生。

  • 我的应用有多个视图
  • 我想使用我的单例类来创建一个 tcp 套接字连接并始终保持连接打开
  • 我不知道在哪里调用/调用我的单例类对象
  • 我不知道如何调用/调用我的单例类对象
  • 我正在使用 SmallSockets 库

这是我的类文件:

套接字连接.h

#import <Foundation/Foundation.h>

@interface SocketConnection : NSObject
{

}

+ (SocketConnection *)getInstance;

@end

套接字连接.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

要使用此 Singleton 以及与之关联的连接,您可以简单地调用 getInstance 方法来获取对您尝试使用的连接的引用。您将有效地执行此操作,而不是典型的 alloc/init 过程。您可以从每个视图中使用 getInstance 方法,它们都将保持与您预期的相同的连接。

此外,由于您创建单例的方式,如果您调用 alloc/init 而不是 getInstance,您将创建一个新连接而不是使用以前的连接。

您可以如何执行此操作以在视图中创建引用的示例如下:

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

与此类似的代码将导致您的所有视图使用相同的连接,但不会创建连接,直到您在屏幕上看到正在使用该连接的视图。要在应用程序启动时创建连接,请将相同的“getInstance”添加到您的 appDelegate 方法之一。

此外,因为您使用的是单例,并且此变量从未真正释放,您可能需要考虑添加方法来重新初始化、删除和一般管理与服务器的连接。

于 2012-06-04T14:12:19.290 回答
0

我可能会在 UIApplication Delegate 方法中执行初始化

- (void)applicationDidFinishLaunching:(UIApplication *)application

这样,连接就会启动并开始,您可以在任何 View 或 ViewController 出现或处于活动状态之前执行初始化。

于 2012-06-04T14:18:19.320 回答