2012-01-17 6 views
4

私は、UIManagedDocumentの共有インスタンスを配布するヘルパークラスを持っています。アイデアは、ユーザーがディスク上の特定のファイルのUIManagedDocument共有インスタンスを要求することです。この場合、それはコアデータストアです。ユーザーが別のパスにあるコアデータストアを要求した場合は、そのファイルのUIManagedDocumentのインスタンスを配布します。クラスメソッドを使用して、UIManagedDocumentの複数の共有インスタンスをどのように配布しますか?

質問:UIManagedDocumentの新しいインスタンスを作成し、ファイルが変更されたときに静的変数に割り当てることはできますか?たとえば、次のように

+ (UIManagedDocument *)sharedManagedDocumentForFile:(NSString *)fileName 
{ 
    static UIManagedDocument *sharedDocument = nil; 

    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:fileName]; 
    // url is "<Documents Directory>/<vacationName>" 

    // Create the shared instance lazily upon the first request. 
    if (sharedDocument == nil) { 
     sharedDocument = [[UIManagedDocument alloc] initWithFileURL:url]; 
    } 

    if (sharedDocument.fileURL != url) { 
     UIManagedDocument *newDocument = [[UIManagedDocument alloc] initWithFileURL:url]; 
     sharedDocument = newDocument; 
    } 

    return sharedDocument; 
} 

基本的に私はイベントで、私は常に変化を続ける必要はありませんコアデータストアへの複数の作家があるので、UIManagedDocumentのインスタンスを1つだけ配布されてやろうとしています同期。しかし、ディスク上に複数のコアデータストアが存在するため、毎回同じ静的変数を配布するだけではありません。

アイデア?私は絶対にこの設計問題に近づく方法でさえ固執しています...どんな助けもありがとうございます。

おかげ - ジェイク

+5

これは必須の文章と思われます。 – PengOne

+0

@Jave V彼が冗談を言っていたと思うよ...笑 – bschultz

+0

「ok」と「legal」は正確に何を意味しますか? – occulus

答えて

6

[OK]を、あなたは私はあなたがやろうとしていると思う何をしようとしている場合:いいえ、これは動作しません。

sharedDocumentsの存在とは別に、要求されたディスク上の一意のファイルごとにsharedDocumentを保存したいとします。しかし、あなたのコードでは、fileNameが最後に渡されたfileNameと異なるものが渡されるたびに、古いへの参照が失われるため、コードはそれを行いません。真ん中のラインはあなたの静的変数は、元のを忘れて発生したため、

UIManagedDocument *docA = [self sharedManagedDocumentForFile:@"fileA.txt"]; 
UIManagedDocument *docB = [self sharedManagedDocumentForFile:@"fileB.txt"]; 
UIManagedDocument *docA2 = [self sharedManagedDocumentForFile:@"fileA.txt"]; 

あなたは同じUIManageDocumentするdocAdocA2を期待しているが、それは起こりません。

は、以下の(不自然)のシナリオを想像してみてfile1.txt1の管理文書。

私は静的変数の使用を断念したいと思います。あなたがこれを行うことができる他の多くの方法があります。簡単な方法は、NSMutableDictionaryを使用して、ファイル名をUIManagedDocumentインスタンスにマッピングすることです。このような何か:

+ (UIManagedDocument *)sharedManagedDocumentForFile:(NSString *)fileName 
{ 
    //assuming we have an instance variable: NSMutableDictionary *docDictionary 
    UIManagedDocument *doc = [docDictionary objectForKey:fileName]; 

    if (!doc) { 
     NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
     url = [url URLByAppendingPathComponent:fileName]; 
     // url is "<Documents Directory>/<vacationName>" 

     doc = [[UIManagedDocument alloc] initWithFileURL:url]; 

     [docDictionary setObject:doc forKey:fileName]; 
    } 
    return doc; 
} 

更新

sharedManagedDocumentForFile:がクラスメソッドであるため、あなたが注意として、あなたは、あなたのクラスのインスタンス変数としてdocDictionaryを格納することはできません。代わりに、あなたがそうのようなあなたのクラスの実装前に、あなたの.mファイルでそれを宣言することができます効果で

static NSMutableDictionary *docDictionary = nil; 

@implementation MyClass ... 

これはあなたのクラスのすべてのインスタンスの外に存在する単一docDictionaryインスタンスを提供します。あなたのクラスのインスタンスは引き続きアクセスできます。

キーワードstaticは、このdocDictionary変数が現在のコンパイル単位(つまりソースファイル)の外部にアクセスできないことを保証します。静的およびその多くの異なる意味の詳細については、Difference between static in C and static in C++??

+0

オクルス - 応答いただきありがとうございます。あなたが提案したことは、あなたの例で説明した理由のために、より良い解決策です。私が理解していないことが1つあります。 'sharedManagedDocumentForFile'がクラスメソッドである場合、どのようにしてインスタンス変数docDictionaryにアクセスできますか? –

+0

ゴーゴ質問です。私の答えを更新する。 – occulus

+0

ありがとう!私はこれを実装しており、完全に動作しているようです。 –

0

などの質問を参照してください。 addObjectではなくsetObjectを使用します。

関連する問題