我在创建一个单身人士吗?

时间:2014-02-11 17:29:35

标签: ios objective-c core-data singleton

我需要一个标准列表,从中创建谓词以返回根据用户输入进行各种排序的数据。因此,创建一个名为“SearchSpecs”的实体及其关联的子类文件SearchSpecs.hSearchSpecs.m似乎是合理的。通过这种方式,我的其他类可以使用此类中的方法和属性来创建一个“规范表”,从中启动Core Data fetch。

然而,我注意到关于“单身人士”似乎存在相当多的争议。我很新,据我所知,从来没有创造过一个单身人士,想知道我现在是不是这样做了?

明白我不想重新开启或煽动单身辩论的火焰,因为我真的不知道它是什么。但我也不想在我的应用程序中创建一些怪物。

有人可以向我保证我的方法是安全合理的吗?

以下是我的SearchSpecs.hSearchSpecs.m文件中的相关代码:

//
//  SearchSpecs.h
//  WMDGx
//
//  Created by Tim Jones on 2/7/14.
//  Copyright (c) 2014 TDJ. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface SearchSpecs : NSManagedObject


// Properties

@property (nonatomic, retain) NSDate * fromDate;
@property (nonatomic, retain) NSDate * toDate;
@property (nonatomic, retain) NSString * categoryOfInterest;
@property (nonatomic, retain) NSString * activityOfInterest;
@property (nonatomic, retain) NSString * benchmarkCategory;
@property (nonatomic, retain) NSString * benchmarkActivity;

// Set Methods

- (void) setActivityOfInterest:(NSString *)activityOfInterest;
- (void) setCategoryOfInterest:(NSString *)categoryOfInterest;
- (void) setBenchmarkActivity:(NSString *)benchmarkActivity;
- (void) setBenchmarkCategory:(NSString *)benchmarkCategory;
- (void) setFromDate:(NSDate *)fromDate;
- (void) setToDate:(NSDate *)toDate;

// Create and delete

- (void) createFreshSpecSheet;
- (void) saveSpecSheet;
- (void) deleteSpecSheet;

@end

//
//  SearchSpecs.m
//  WMDGx
//
//  Created by Tim Jones on 2/7/14.
//  Copyright (c) 2014 TDJ. All rights reserved.
//

#import "SearchSpecs.h"


@implementation SearchSpecs

@dynamic toDate;
@dynamic fromDate;
@dynamic benchmarkCategory;
@dynamic benchmarkActivity;
@dynamic categoryOfInterest;
@dynamic activityOfInterest;


- (void) setActivityOfInterest:(NSString *)activityOfInterest
{

}

- (void) setCategoryOfInterest:(NSString *)categoryOfInterest
{

}

- (void) setBenchmarkActivity:(NSString *)benchmarkActivity
{

}

- (void) setBenchmarkCategory:(NSString *)benchmarkCategory
{

}

- (void) setFromDate:(NSDate *)fromDate
{

}

- (void) setToDate:(NSDate *)toDate
{

}

- (void) createFreshSpecSheet

{

}

- (void) saveSpecSheet
{

}

- (void) deleteSpecSheet
{

}



@end

感谢您的帮助!

6 个答案:

答案 0 :(得分:5)

现在你知道这不是一个单身人士。它也不是NSManagedObject的正确形成的子类。为什么?您正在定义属性和访问者。这会让你有些困惑。您的标题应为:

@interface SearchSpec : NSManagedObject

// Properties

@property (nonatomic, retain) NSDate *fromDate;
@property (nonatomic, retain) NSDate *toDate;
@property (nonatomic, retain) NSString *categoryOfInterest;
@property (nonatomic, retain) NSString *activityOfInterest;
@property (nonatomic, retain) NSString *benchmarkCategory;
@property (nonatomic, retain) NSString *benchmarkActivity;

@end

设置访问器是多余的,因为属性会为您执行此操作。您的创建,添加等也是多余的,因为这是Core Data将为您处理的内容。所以你的实现现在看起来像这样:

@implementation SearchSpec

@dynamic fromDate;
@dynamic toDate;
@dynamic categoryOfInterest;
@dynamic activityOfInterest;
@dynamic benchmarkCategory;
@dynamic benchmarkActivity;

@end

更清洁。那你怎么创建一个实例呢?不是[[SearchSpec alloc] init]!您需要让Core Data为您创建它:

NSManagedObjectContext *moc = ...; //Use your existing MOC
SearchSpec *spec = [NSEntityDescription insertNewObjectForEntityForName:@"SearchSpec" inManagedObjectContext:moc];

删除现有规范:

NSManagedObjectContext *moc = ...; //Use your existing MOC
SearchSpec *spec = ...; //Your existing spec object
[moc deleteObject:spec];

最后,要保存您对规范所做的任何更改:

NSManagedObjectContext *moc = ...; //Use your existing MOC
SearchSpec *spec = ...; //Your existing spec object
NSError *error = nil;
if ([moc save:&error] == NO) {
    NSLog(@"Error saving spec: %@\n%@", [error localizedDescription], [error userInfo]);
}

核心数据为您管理数据的生命周期。因此,您可以使用上下文添加/删除/更新数据对象。

答案 1 :(得分:1)

singleton 是一个只有一个实例的类。您通常可以识别单身人士,因为他们有一个名为sharedInstancedefaultManager的类方法来检索单个实例。你只有另一种实体类型。它可能是一个事实上的单例,如果你只创建其中一个,但它在技术上不是单例,除非不可能创建更多的实例。

如上所述,您的方法是合理的。鉴于您的SearchSpecs实体的属性,您可能会发现将它们作为字典数组保存在属性列表中更方便。这取决于你将如何使用它们。如果您要查找具有SearchSpecsbenchmarkCategory特定值的activityOfInterest的所有实例,请将它们放入Core Data并使用谓词查找正确的实例会有所帮助。另一方面,如果您每次都在运行所有实例,那么使用Core Data将无济于事。

一方面注意:作为一种风格问题,我建议命名实体SearchSpec而不是SearchSpecs。每个实例都是一个搜索规范,所以如果是我,我就不会复制实体名称。

答案 2 :(得分:0)

你拥有的只是一个物体。

例如,你的 AppDelegate 是最接近单身人士的东西(但事实并非如此,感谢Marcus澄清这一点)。

Singleton是一个静态对象,可以在应用程序的整个生命周期中保留。可以从应用程序的任何位置访问此静态对象。所以现在它取决于你想保留你提供代码的对象的位置。如果您希望能够从应用中的任何位置访问它,并且只需要一个引用它,则它被视为单身。

我希望有所帮助! 快乐的编码:)

答案 3 :(得分:0)

不。您已申报了一个班级。那不是单身人士。

如果你强制执行不超过一个SearchSpecs并且所有客户共享一个实例,那么你就会有一个单例。

您的客户可以创建多个SearchSpecs个实例;每个实例都有自己的数据。

答案 4 :(得分:0)

正如其他人明确指出你创建一个单身人士。

问题是你是否想要?如果您打算只有这个类的一个实例并且由于某种原因能够从多个类引用它,那么您可能想要创建此类的单例实例。

您可以通过添加以下类方法

来实现 你的.h

中的

+ (instancetype) sharedSearchSpecs;
你的.m

中的

 + (instancetype) sharedSearchSpecs{
    static id sharedSearchSpecs = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedSearchSpecs = [[SearchSpecs alloc] init];
    });

    return sharedSearchSpecs;
}

这将提供此类的单个实例

关于单身人士是好还是坏的争论。这不是一个问题,尽管有些人会认为它是。这是一个关于您需要什么以及它在项目中是否合适和有效的问题。所以,坚持下去,享受

答案 5 :(得分:-1)

既然你可以这样做

SearchSpecs *spec = [[SearchSpecs alloc] init];

您创建实例,因此它不是单身人士。我认为你的实施没有问题。

但是,如果你想创建一个单例,而不是一个静态类的静态类(你不在看SearchSpecs类中的属性),你可以修改

-(id)init
{
    static SearchSpecs *singleton;
    if(singleton == nil)
        singleton = [super init];

    return singleton;
}

或类似的东西,以确保只有一个SearchSpecs副本。但是,可能有更好的方法来创建单身人士。这很快又很脏。