iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
アプリケーション共通のデータをDocumentクラスで管理するようにしている。
#import <Foundation/Foundation.h>
#import "RFC.h"
@interface Document : NSObject
@property (strong, nonatomic) NSString *version;
@property (strong, readonly, nonatomic) NSString *indexUrlString;
@property (strong, nonatomic) NSArray *indexArray;
+ (Document *)sharedDocument;
- (void)load;
- (void)save;
- (NSString *)rfcUrlStringWithIndex:(NSUInteger)index;
@end
#import "Document.h"
@interface Document ()
@property (strong, readwrite, nonatomic) NSString *indexUrlString;
@property (strong, nonatomic) NSString *baseUrlString;
- (void)_clearDefaults;
- (void)_updateDefaults;
- (void)_loadDefaults;
@end
@implementation Document
@synthesize version = _version;
@synthesize indexUrlString = _indexUrlString;
@synthesize indexArray = _indexArray;
@synthesize baseUrlString = _baseUrlString;
+ (Document *)sharedDocument;
{
static Document *_sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[Document alloc] init];
});
return _sharedInstance;
}
- (id)init
{
DBGMSG(@"%s", __func__);
self = [super init];
if (self) {
_version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
_indexUrlString = @"http://www.rfc-editor.org/rfc/rfc-index.txt";
_indexArray = [[NSArray alloc] init];
_baseUrlString = @"http://www.ietf.org/rfc";
}
return self;
}
- (void)dealloc
{
DBGMSG(@"%s", __func__);
self.version = nil;
self.indexUrlString = nil;
self.indexArray = nil;
self.baseUrlString = nil;
}
- (void)load
{
DBGMSG(@"%s", __func__);
[self _loadDefaults];
}
- (void)save
{
DBGMSG(@"%s", __func__);
[self _updateDefaults];
}
- (NSString *)rfcUrlStringWithIndex:(NSUInteger)index
{
NSString *urlString = [[NSString alloc] initWithFormat:@"%@/rfc%04u.txt", self.baseUrlString, index];
return urlString;
}
- (void)_clearDefaults
{
DBGMSG(@"%s", __func__);
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"version"]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"version"];
}
}
- (void)_updateDefaults
{
DBGMSG(@"%s", __func__);
NSString *versionString = nil;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"version"]) {
versionString = [[NSUserDefaults standardUserDefaults] objectForKey:@"version"];
}
if ((versionString == nil) || ([versionString compare:self.version] != NSOrderedSame)) {
[[NSUserDefaults standardUserDefaults] setObject:self.version forKey:@"version"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
- (void)_loadDefaults
{
DBGMSG(@"%s", __func__);
NSString *versionString = nil;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"version"]) {
versionString = [[NSUserDefaults standardUserDefaults] objectForKey:@"version"];
}
if ((versionString == nil) || ([versionString compare:self.version] != NSOrderedSame)) {
/* バージョン不一致対応 */
}
else {
/* 読み出し */
}
}
@end
このDocumentクラスのインスタンスへのアクセスだが、以前は、アプリケーションのデリゲートのインスタンスにして、以下のようにアクセスしていたが、冗長なのでシングルトンとした。
#import "AppDelegate.h"
AppDelegate *appl = nil;
appl = (AppDelegate *)[[UIApplication sharedApplication] delegate];
Document *document = appl.document;
シングルトンの為のクラス・メソッドも、以前は、以下のように実装していたが、GCDのdispatch_once関数を使った実施に変更している。
static Document *_sharedInstance = nil;
+ (Document *)sharedDocument
{
if (!_sharedInstance) {
_sharedInstance = [[Document alloc] init];
}
return _sharedInstance;
}
そして、Documentクラスには、必ず、NSUserDefaultsを利用した初期設定値の保存と読み込みを用意して、最低でもバージョン番号を保存するようにしている。これは、後でNSUserDefaultsを利用したくなった際に、以前のバージョンでは保存していないと、バージョン際が発生した際の判断が面倒になるためだ。
- _updateDefaultsメソッドで保存し、- _loadDefaultsメソッドで読み込んでいる。
NSUserDefaultsの読み書きメソッドは、- loadメソッドと- saveメソッドから呼ぶようにして、このメソッドをアプリケーション・デリゲートのアプリ起動時やバックグラウンドに遷移するタイミングで呼ばれるようにしている。
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
DBGMSG(@"%s", __func__);
[[Document sharedDocument] load];
[[Connector sharedConnector] addObserver:self
forKeyPath:@"networkAccessing"
options:0
context:NULL];
return YES;
}
:
- (void)applicationWillResignActive:(UIApplication *)application
{
DBGMSG(@"%s", __func__);
[[Document sharedDocument] save];
}
:
@end