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.
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 –