• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 试图了解何时以及何时不使用单例

[复制链接]
菜鸟教程小白 发表于 2022-12-13 06:38:19 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

有很多关于单例的信息,什么时候使用它,为什么你不应该使用它等等。所以为了更好地掌握它,也许有人可以用我正在制作的应用程序中的示例来解释它。

我正在使用 Parse 创建一个带有用户注册的应用。如果我以这种方式使用单例,这是好的还是坏的做法?我在想我将使用我的 User 类在整个应用程序中用户相关操作,也许创建一次 User 类的实例是个好主意:

//  User.h

@interface User : NSObject

+ (instancetype)sharedInstance;

- (void)createNewUserNSString *)username passwordNSString *)password emailNSString*)email;

@end

// User.m

#import "User.h"
#import <arse/Parse.h>

@implementation User

+ (instancetype)sharedInstance {
    static id sharedInstance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
        NSLog(@"sharedInstance User.m");
    });

    return sharedInstance;
}

- (void)createNewUserNSString *)username passwordNSString *)password emailNSString*)email {
    // Create a new user
    PFUser *newUser = [PFUser user];
    newUser.username = username;
    newUser.password = password;

    // Additional user information
    newUser[@"email"] = email;

    [newUser signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (!error) {
            // Hooray! Let them use the app now.
            NSLog(@"Success created user: %@", newUser);
        } else {
            NSString *errorString = [error userInfo][@"error"];
            // Show the errorString somewhere and let the user try again.
            NSLog(@"Error: %@", errorString);
        }
    }];
}

@end

// LoginViewController.m

#pragma mark - IBActions

- (IBAction)loginButtonClickedUIButton *)sender 
{    
    [[User sharedInstance] createNewUser:self.usernameTextField.text
                                password:self.passwordTextField.text
                                   email:self.emailTextField.text];
}

或者这样做更好:

// User.h

@interface User : NSObject

- (void)createNewUserNSString *)username passwordNSString *)password emailNSString*)email;

@end

// User.m

@implementation User

- (void)createNewUser:(NSString *)username password:(NSString *)password email:(NSString*)email {
    // Create a new user
    PFUser *newUser = [PFUser user];
    newUser.username = username;
    newUser.password = password;

    // Additional user information
    newUser[@"email"] = email;

    [newUser signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (!error) {
            // Hooray! Let them use the app now.
            NSLog(@"Success created user: %@", newUser);
        } else {
            NSString *errorString = [error userInfo][@"error"];
            // Show the errorString somewhere and let the user try again.
            NSLog(@"Error: %@", errorString);
        }
    }];
}

@end

// LoginViewController.m

- (IBAction)loginButtonClicked:(UIButton *)sender
{
    User *newUser = [User new];

    [newUser createNewUser:self.usernameTextField.text
                  password:self.passwordTextField.text
                     email:self.emailTextField.text];
}

另外,如果我误用了任何方式,请直说,感谢您的诚实!



Best Answer-推荐答案


当你想把某样东西做成单例时,这样想:

  • 这个类真的每个应用程序一个永远吗? (例如,在您的情况下,我可以看到,一段时间后您会希望管理员以您应用程序的某个用户身份登录,并且您最终会得到两个用户对象)
  • 这个类会真的永远如此简单,以至于我不会遭受单例测试和全局化问题的困扰吗(单例使单元测试变得困难,并且它们将全局实体添加到您的程序中使得很难跟踪各个应用程序对其所做的更改)

如果任一选项适用于您的情况,请执行以下操作:

  • 不要让类(class)成为单例
  • 使用依赖注入(inject)容器或注册表模式将您的类绑定(bind)到它,并始终根据容器/注册表解析该类

关于ios - 试图了解何时以及何时不使用单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29854821/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap