2014-01-08 2 views
1

Как синхронизировать из / для Mac OSX с Как синхронизировать NSDocument от IPad/iPhone для Mac OSX с ICloud

мне удалось получить его работу! от Mac OSX к iPhone/IPad, но не от IPad/iPhone для Mac OSX

Вот мой код из наследнике файла на :

Заголовок файла:

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

@interface subclassedNSDocument : NSDocument 

@property (strong) NSData *myData; 

@end 

файл Реализация:

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError 
{ 
    BOOL readSuccess = NO; 
    if (data) 
    { 
     readSuccess = YES; 
     [self setMyData:data]; 
    } 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"dataModified" 
                 object:self]; 

    return readSuccess; 
} 

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError 
{ 
    if (!myData && outError) { 
     *outError = [NSError errorWithDomain:NSCocoaErrorDomain 
             code:NSFileWriteUnknownError userInfo:nil]; 
    } 
    return myData; 
} 

и в файле AppDelegate.m:

#define kFILENAME @"mydocument.dox" 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSURL *ubiq = [[NSFileManager defaultManager] 
        URLForUbiquityContainerIdentifier:nil]; 
    if (ubiq) { 
     NSLog(@"iCloud access at %@", ubiq); 
     // TODO: Load document... 
     [self loadDocument]; 
    } 
    else 
    { 
     NSLog(@"No iCloud access"); 
    } 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(dataReloaded:) 
               name:@"dataModified" object:nil]; 
} 

- (void)update_iCloud 
{ 
    NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; 
    NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:kFILENAME]; 
    self.doc.myData = [NSKeyedArchiver archivedDataWithRootObject:[@"Your Data Array or any data", nil]]; 
    [self.doc saveToURL:ubiquitousPackage ofType:@"dox" forSaveOperation:NSSaveOperation error:nil]; 
} 

- (void)loadData:(NSMetadataQuery *)query { 

    if ([query resultCount] == 1) { 

     NSMetadataItem *item = [query resultAtIndex:0]; 
     NSURL *url = [item valueForAttribute:NSMetadataItemURLKey]; 
     NSLog(@"url = %@",url); 
     subclassedNSDocument *doc = [[subclassedNSDocument alloc] initWithContentsOfURL:url ofType:@"dox" error:nil]; 
     [doc setFileURL:url]; 
     self.doc = doc; 
    } 
    else { 

     NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; 
     NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:kFILENAME]; 

     dataUrls *doc = [[dataUrls alloc] init]; 
     [self.doc setFileURL:ubiquitousPackage]; 
     self.doc = doc; 
     [self.doc saveToURL:ubiquitousPackage ofType:@"dox" forSaveOperation:NSSaveOperation error:nil]; 
    } 

} 

- (void)queryDidFinishGathering:(NSNotification *)notification { 

    NSMetadataQuery *query = [notification object]; 
    [query disableUpdates]; 
    [query stopQuery]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:NSMetadataQueryDidFinishGatheringNotification 
                object:query]; 

    _query = nil; 

    [self loadData:query]; 

} 

- (void)loadDocument { 

    NSMetadataQuery *query = [[NSMetadataQuery alloc] init]; 
    _query = query; 
    [query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]]; 
    NSPredicate *pred = [NSPredicate predicateWithFormat: @"%K == %@", NSMetadataItemFSNameKey, kFILENAME]; 
    [query setPredicate:pred]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query]; 

    [query startQuery]; 

} 

- (void)dataReloaded:(NSNotification *)notification 
{ 
    self.doc = notification.object; 

    NSArray *arrFromCloud = [NSKeyedUnarchiver unarchiveObjectWithData:self.doc.myData]; 

    //Update you UI with new data 
} 

Вопрос заключается в том: Единственное, что у меня нет работает в том, что если я изменю данные документа на IPad, приложение Mac не вызывает метод readFromData для обновления от iCloud, кто-нибудь знает, что мне не хватает?

На iOS эквивалентный метод, loadFromContents, вызывается автоматически при каждом изменении UIDocument в iCloud. В OS X readFromData вызывается один раз при загрузке, но никогда не вызывается снова.

Надеюсь, мой код может помочь, для меня он работает в одном направлении от Mac до iPad.

+0

Привет, вы когда-нибудь это разрешили? Я столкнулся с той же проблемой. Я вижу из отладчика, что iCloud загружает некоторые данные, но наблюдатель просто не запускается. Я также попытался добавить наблюдателя NSMetadataQueryDidUpdateNotification', но все равно не пошел. – soemarko

ответ

1

Исправлено.

По-видимому, это просто плохо реализованный и чрезмерно сложный образец кода.

На applicationDidFinishLaunching: нам просто нужно

_query = [[NSMetadataQuery alloc] init]; 
[_query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]]; 
NSPredicate *pred = [NSPredicate predicateWithFormat: @"%K == %@", NSMetadataItemFSNameKey, kFILENAME]; 
[_query setPredicate:pred]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryUpdated:) name:NSMetadataQueryDidUpdateNotification object:_query]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryUpdated:) name:NSMetadataQueryDidFinishGatheringNotification object:_query]; 
[_query startQuery]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataReloaded:) name:@"dataModified" object:nil]; 

И добавьте следующий метод:

- (void)queryUpdated:(NSNotification *)notification { 
    NSLog(@"queryUpdated called..."); 
    NSMetadataQuery *query = [notification object]; 
    [query disableUpdates]; 

    if ([query resultCount] == 1) { 
     // update views, etc. here 
    } 

    [query enableUpdates]; 
} 

Затем удалить все невостребованные методы из исходного образца.