【发布时间】:2015-04-26 04:42:36
【问题描述】:
有很多关于单例的信息,什么时候使用它,为什么你不应该使用它等等。所以为了更好地掌握它,也许有人可以用我正在制作的应用程序中的示例来解释它。
我正在使用 Parse 创建一个带有用户注册的应用。如果我以这种方式使用单例,这是好的还是坏的做法?我想我将使用我的User 类在整个应用程序中与用户相关的操作,也许创建一次User 类的实例是个好主意:
// User.h
@interface User : NSObject
+ (instancetype)sharedInstance;
- (void)createNewUser:(NSString *)username password:(NSString *)password email:(NSString*)email;
@end
// User.m
#import "User.h"
#import <Parse/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)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
#pragma mark - IBActions
- (IBAction)loginButtonClicked:(UIButton *)sender
{
[[User sharedInstance] createNewUser:self.usernameTextField.text
password:self.passwordTextField.text
email:self.emailTextField.text];
}
或者这样做更好:
// User.h
@interface User : NSObject
- (void)createNewUser:(NSString *)username password:(NSString *)password email:(NSString*)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];
}
另外,如果我误用了任何方式,请直说,感谢您的诚实!
【问题讨论】:
-
> “我将使用我的用户类来做很多不同的事情” - 让类做很多不同的事情是一种不好的做法。检查“单一责任”原则。
-
也许那一点有点不清楚,将我的问题的那部分更新为:“我想我将使用我的用户类来用户相关操作”@Avt