0

私は、単一のドキュメントをユビキタス コンテナーを介して iOS の同等のアプリとの間で同期する OS X アプリを持っています。iOS アプリは、Mac 側で変更されるたびにデータを受信し、iOS 側で変更されるたびにデータを送信します (したがって、iOS アプリはすべての場所で動作しています)。Mac アプリは、Mac 側で変更されるたびにデータを送信します。アプリの起動時にデータを受け取りますが、実行中にデータを再度チェックしているようには見えません。OS Xの「メモ」アプリがiOS側の変更から行うように、変更があれば自動的かつすぐに更新したいと思います。

起動時に呼び出される関連関数は次のとおりです。

+(NSMutableDictionary *)getAllNotes {
    if(allNotes == nil) {
        allNotes = [[NSMutableDictionary alloc]initWithDictionary:[[NSUserDefaults standardUserDefaults] dictionaryForKey:kAllNotes]];

        cloudDoc = [[CloudDocument alloc]initWithContentsOfURL:[self notesURL] ofType:NSPlainTextDocumentType error:nil];
        [cloudDoc saveToURL:[self notesURL] ofType:NSPlainTextDocumentType forSaveOperation:NSSaveOperation error:nil];
    }
    return allNotes;
}

その「CloudDocument」クラス (のサブクラスNSDocument) には以下が含まれます。

#import "Data.h"

@implementation CloudDocument

-(NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
    return [NSKeyedArchiver archivedDataWithRootObject:[Data getAllNotes]];
}

-(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError {
    NSDictionary *dict = (NSDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)data];
    [Data didReceiveCloudData:dict];
    return YES;
}

+(BOOL)autosavesInPlace {
    return YES;
}

@end

それをキックバックします:

+(void)didReceiveCloudData:(NSDictionary *)d {
    allNotes = [[NSMutableDictionary alloc]initWithDictionary:d];
    [[NSUserDefaults standardUserDefaults] setObject:allNotes forKey:kAllNotes];

    [cloudDoc updateChangeCount:NSChangeDone];
}

問題は、「ユビキタス コンテナーが変更されたかどうかを定期的に確認してから実行する...」などのフレーズに相当するコードの部分がないことだと思います。これについてはよく知られたプロセス (NSDocumentまたは何らかの通知イベント) がありますが、私が見つけたものはすべて、OS X/NSDocuments ではなく iOS/UIDocuments のいずれかであるか、またはそれはすべて理論であり、具体的なコードがなくても私の頭の上にあります。梳かしてバラバラにするサンプル。

ユビキタス コンテナ内の iCloud ドキュメントが変更されたことを登録する方法と、理想的にはそれを配置する場所 (AppDelegate、CloudDocument.m など) を手伝ってくれる人はいますか? 定数 で示される 1 つのファイルしか同期してkAllNotesいないので、さまざまなファイルなどを追跡する必要はありません。起動時に実行されるコードを使用して、実行する必要があることを実行できると確信していますが、自動同期プロセスを開始するために何をすべきかわかりません。

前もって感謝します!

PS 私はまだ初心者なので、チュートリアルとコード サンプルは大歓迎です。

4

2 に答える 2

3

あなたが探しているのは NSMetadataQuery です - これはあらゆるタイプのファイルに対してスポットライトのように継続的に検索を実行し、iOS と OS X の両方で利用できます (実際、iOS では、ユビキタス コンテナーへの変更を監視するためにのみ使用できます)。これを使用する方法についてのリンクはありません。Apple ドキュメントは一般的すぎて最初はあまり意味がありませんが、「NSMetadataQuery iCloud」で検索してください。ソートする必要があります。このトピックに関する情報はたくさんあります。 .

NSMetadataQuery を使用すると、監視対象のフォルダー システムで何かが変更されるたびに通知を受け取ります。多くの例で UIDocuments が心配されている場合でも、UIDocument ファイルだけに適用されるわけではありません。

于 2013-06-15T12:02:37.707 に答える