2011-12-28 11 views
5

Sorun: Aygıt A'daki bir iCloud belgesinde çalışıyorum, ör. ipod touch. Ardından, belgenin adını B cihazında değiştiririm. Mac'im (Finder aracılığıyla). Bu değişiklik, buluta gider ve bir duraklatma cihazı A'nın bunu duyduktan sonra.iCloud - başka bir cihazda açık belgeleri yeniden adlandırma bazen başarısız oluyor

Ve sonra:

  • tüm zamanların bazıları sadece ince - Ben değişti fileURL özellik aracılığıyla ismin değiştirilmesiyle almak ve buna göre benim arayüzünü güncelleyebilirsiniz - Belge sadece olması gerektiği gibi davranmaya devam ediyor
  • Bazı durumlarda, belgenin fileURL'si şöyle bir şey olarak döndürülür: file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39-FCC4EF3BC8F8-v23/ftr/purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95 Şaşırtıcı olmayan bir şekilde bu dosya kaydedilmez.

Neler olup bittiğini ve nasıl çalışılacağını açıklayabilir mi?

Arkaplan

  • isim değişikliği NSMetadataQuery tarafından ince alınır. Yani, örneğin, açık olmayan belgeleri yeniden adlandırabilir ve tüm iCloud işlevlerim düzgün çalışıyor. Sorun sadece açık belgelerle ortaya çıkıyor gibi görünüyor.

  • Diğer iCloud özellikleri, örn. İçeriği bir cihazda değiştirebilirim, ör. Mac'im ve başka bir cihazdaki arayüzümü algılayıp güncelleştirin, ör. İlgili iCloud belgesine sahip olan iPod Touch'ım.

  • UIDocument alt sınıfıma presentedItemDidMoveToURL: için bir geçersiz kılma eklediğimde bunu ilk kez farkettim. Geçersiz kılma, bulutta yapılan isim değişikliklerini güvenilir şekilde alır, ör. dokümanı başka bir cihazda yeniden adlandırmak. O zaman bazen newURL, yeniden adlandırılmış belge için beklenen son URL'dir, yani yeni isim kullanımı 'lastPathComponent' çıkartabildiğim mantıklı bir şey, arayüzümü günceller vs. Diğer durumlarda newURL, diğer bir dizinde son bir belgedir. yol bileşeni 'purg-' başlangıcı, örn. purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95.

    - (void) presentedItemDidMoveToURL:(NSURL *) newURL; 
    { 
        [super presentedItemDidMoveToURL: newURL]; 
    
        if ([(id)[self delegate] respondsToSelector:@selector(documentNameChanged:)]) 
        { 
         [[self delegate] documentNameChanged: self]; 
        } 
    } 
    
  • presentedItemDidMoveToURL: yöntem, sorunun asıl nedeni olmaya görünmüyor. Ben hiç öyle yöntemini geçersiz ama periyodik bir yeniden adlandırma sonra sonra, açık belgeye sonra bakıyor ViewController içinde bazen kontrol etmiyoruz Örneğin, fileURL `purg yeni adı ve bazen onu dönecektir dönecektir -..... '. Dolayısıyla, sorunun yeniden adlandırmanın nasıl yapıldığıyla ilgili olduğu anlaşılıyor. al_lea belirttiği gibi

Güncelleme

, burada mesele accommodatePresentedItemDeletionWithCompletionHandler: ilgiliydi. Al_lea'nın cevabını genişleterek, aşağıdaki kodu UIDocument alt sınıfıma ekledim. Bu sorunu çözdü. yerine bu kod ile

- (void) accommodatePresentedItemDeletionWithCompletionHandler: (void (^) (NSError *errorOrNil)) completionHandler 
    {  
     PresentedDocument* presentedDocument = [self retain]; 
     [presentedDocument closeWithCompletionHandler: ^(BOOL success) {   
      NSError* error = nil; 
      if (!success) 
      { 
       NSDictionary* userInfo = [NSDictionary dictionaryWithObjectsAndKeys: 
        @"Could not close document that is being deleted on another device", 
        NSLocalizedDescriptionKey, nil]; 
        error = [NSError errorWithDomain: @"some_suitable_domain" 
               code: 101 
              userInfo: userInfo]; 
      } 

     completionHandler(error); // run the passed in completion handler (required) 

     dispatch_async(dispatch_get_main_queue(),^
     { 
      [[NSNotificationCenter defaultCenter] postNotificationName: NOTIFY_presentedDocumentDeletedOnAnotherDevice 
                   object: presentedDocument 
                  userInfo: nil]; 

      [presentedDocument tidyUpAfterDelete]; // app specific tidy up 
      [presentedDocument release]; 
     }); 
    }]; 
} 

, hiçbir sahte ve kafa karıştırıcı presentedItemDidMoveToURL vardır: arama yapılamaz ve ek olarak, ilgili nesnenin diğer cihazlarda silme işlemleri bildirimler için dinleyebilirsiniz.

+0

Bir ay boyunca sadece DocumentState kullanarak iCloud çalışması yapmaya çalıştım - bu, eksik olduğum parçaydı. Bu kod öğeleri eklemeden önce, bazen silindikten sonra geri dönebilir veya sürekli değişen belge durumlarının sürekli bir akışını alırdım –

cevap

6

URL'ye Bu tür bir UIDocument yerel üzerinde açılır ve uzak bir cihazdan silinir görüntülenen:

file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39-FCC4EF3BC8F8-v23/ftr/purg- silindikten olsun ilk önce belgeyi kapatmak gerekir

- NSFilePresenter en accommodatePresentedItemDeletionWithCompletionHandler: bu algılamak

İlgili konular