お返事ありがとうございます。私はこれが正しいことをやっているのかどうかはわかりませんが、これは私が今投稿したプロジェクトでやったことです。
私はユーティリティメソッドとグローバルの2つのクラスを作成しました。 Utilitiesクラスのメソッドは、ファイルと定数またはグローバルで動作するため、すべてのクラスメソッドです。それから私はグローバル変数のためのシングルトンを作った。 .pchファイルにグローバル定数がすべてあります。また.pchファイルには、次の2行のコードを入れて、ユーティリティとグローバルをどこでも利用できるようにしています。
// File for utilities like file delete, find Documents file
#import "Utilities.h"
#import "Globals.h"
このメソッドへのアクセスは簡単です。次に、メールのHTMLヘッダーを生成する両方のメソッドを呼び出す例を示します。
NSString *gameNameHeader = [NSString stringWithFormat:@"<p> </p><h1>%@ Results</h1><h2>%@%@</h2>",GAME_NAME_TITLE,[Utilities formattedClientName], [Utilities formattedDate]];
誰でも使用できますが、ここには現在のバージョンのコードがあります。 (フォーマットには申し訳ありませんが、私はウィキが協力するように見えません)。
@interface Utilities : NSObject {
}
+ (NSString *)formattedDate;
+ (NSString *)formattedClientName;
+ (NSString *)cachedResultsFilePath;
+ (NSString *)cachedResultsFileContents;
+ (NSString *)resultsFileName;
+ (NSError *)removeFileFromCache:(NSString *)fileName;
+ (NSString *)applicationCachesDirectory;
+ (NSString *)applicationDocumentsDirectory;
+ (NSString *)applicationLibraryDirectory;
+ (NSError *)copyCachedResultsToFile;
@end
#import "Utilities.h"
@implementation Utilities {
}
+ (NSString *)formattedDate {
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSString *todaysDate = [dateFormatter stringFromDate:[NSDate date]];
return todaysDate;
}
+ (NSString *)formattedClientName {
NSString *client = [NSString stringWithFormat:@" "];
if([Globals sharedInstance].currentClient) client = [NSString stringWithFormat:@" %@ ",[Globals sharedInstance].currentClient];
return client;
}
+ (NSString *)cachedResultsFilePath {
NSString *resultsFilePath = [[self applicationCachesDirectory] stringByAppendingPathComponent:@"Results.txt"];
return resultsFilePath;
}
+ (NSString *)cachedResultsFileContents {
NSStringEncoding encoding; NSError* error = nil;
NSString *resultsText = [NSString stringWithContentsOfFile:[self cachedResultsFilePath] usedEncoding:&encoding error:&error];
return resultsText;
}
+ (NSString *)resultsFileName {
return [NSString stringWithFormat:@"%@ Results%@%@.html",GAME_NAME_TITLE,[self formattedClientName],[self formattedDate] ];
}
+ (NSError *)removeFileFromCache:(NSString *)fileName {
NSError *error = nil;
NSFileManager *localFileManager=[[NSFileManager alloc] init];
NSString *fullPath = [NSString stringWithFormat:@"%@/%@", [self applicationCachesDirectory],fileName];
[localFileManager removeItemAtPath: fullPath error:&error ];
return error;
}
+ (NSString *)applicationCachesDirectory {
return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
}
+ (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
+ (NSString *)applicationLibraryDirectory {
return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
}
+ (NSError *)copyCachedResultsToFile {
// Grab the header and footer and put it around the cached data
NSStringEncoding encoding; NSError *error = nil;
NSString *htmlHeaderTextPath = [[NSBundle mainBundle] pathForResource:@"HTML_header" ofType:@"html" ];
NSString *htmlHeaderText = [NSString stringWithContentsOfFile:htmlHeaderTextPath usedEncoding:&encoding error:&error];
NSString *cachedResultsText = [NSString stringWithContentsOfFile:[self cachedResultsFilePath] usedEncoding:&encoding error:&error];
// Write the results to a file if there are any
if (cachedResultsText) {
NSString *htmlFooterTextPath = [[NSBundle mainBundle] pathForResource:@"HTML_footer" ofType:@"html" ];
NSString *htmlFooterText = [NSString stringWithContentsOfFile:htmlFooterTextPath usedEncoding:&encoding error:&error];
NSString *gameNameHeader = [NSString stringWithFormat:@"<h1>%@ Results for%@%@</h1>",GAME_NAME_TITLE,[self formattedClientName],[self formattedDate] ];
NSString *tempStringP1 = [htmlHeaderText stringByAppendingString:gameNameHeader];
NSString *tempStringP2 = [tempStringP1 stringByAppendingString:cachedResultsText];
NSString *formattedTextForPrinting = [tempStringP2 stringByAppendingString:htmlFooterText];
NSString *resultsFilePath = [ [Utilities applicationDocumentsDirectory] stringByAppendingPathComponent:[self resultsFileName] ];
if (!([[NSFileManager defaultManager] fileExistsAtPath:resultsFilePath])) {
if (! ([[NSFileManager defaultManager] createFileAtPath:resultsFilePath contents:nil attributes:nil])) {
NSLog(@"Error was code: %d - message: %s", errno, strerror(errno));
}
}
NSFileHandle *fileHandler = [NSFileHandle fileHandleForUpdatingAtPath:resultsFilePath];
[fileHandler writeData:[formattedTextForPrinting dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandler closeFile];
}
return error;
}
@end
グローバルなシングルトンです。おそらくスレッドセーフではありませんが、今は気にしません。
@interface Globals : NSObject {
}
@property (nonatomic, strong) NSString *currentClient;
@property (nonatomic, strong) NSString *showmePict;
@property BOOL checkBoxes;
+ (Globals *)sharedInstance;
- (void)resetClient;
@end
@implementationグローバル{
}
static Globals *singleton = nil;
@synthesize currentClient = _currentClient;
@synthesize showmePict = _showmePict;
@synthesize checkBoxes = _checkBoxes;
+(Globals *) sharedInstance {
NSLog (@"sharedInstance of Globals called.");
if (nil != singleton) return singleton;
static dispatch_once_t pred; // lock
dispatch_once(&pred, ^{ // this code is at most once
singleton = [[Globals alloc] init];
});
return singleton;
}
- (void)resetClient {
self.currentClient = nil;
}
@end
あなたは、これらのメソッドが何をするかについて詳しく説明することはできますか?彼らは内部状態を持っていますか? 'getFormattedDate'と' getResultsFilePath'の名前を推測するだけで、メソッド(クラスには関連付けられていない、つまり)ではなく関数である可能性があります。 –
私は専門用語についてはわかりませんが、Obj-Cのすべての「関数」はメソッドと呼ばれていると思いました。これらはクラスメソッドであり、ファイルに対して何かを行う。録音を削除するか、電子メール用のファイルを作成するか、文字列を返します。 Cacheディレクトリの場所。どのユーティリティメソッドも、プロジェクト内のどのオブジェクトについても知る必要はありません。 – JScarry
いいえ、関数とメソッドは非常に似ていますが、メソッドが属し、クラスのデータを操作する重要な違いがあります。一般に、「手続き」(この場合は一般的な用語として、メソッドと関数の両方を扱うことができます)がクラスのデータを操作する必要がない場合は、「普通の」関数として使用する方がよいでしょう。それは「普通の」Cと同じように見えます。 –