setUbiquitous:itemAtURL:destinationURL:error: не удаляет элемент из iCloud

Если я отправлю сообщение

[[NSFileManager defaultManager] setUbiquitous:NO
                                    itemAtURL:url
                               destinationURL:iCloudURL
                                        error:&err]

чтобы удалить элемент из iCloud, он фактически не удаляет файл из Ubiquitous Container. Это ожидаемое поведение?

Метод возвращает НЕТ, а объект ошибки содержит

Домен ошибки = NSCocoaErrorDomain Code = 512 «Операция не может быть завершена. (Ошибка какао 512.)»

UserInfo=0x20870970 {NSURL=file://localhost/var/mobile/Applications/168EE8CD-4CDF-49BE-AD88-1DC7DD9CF25F/Documents/test.txt,

NSUunderlyingError=0x20863a00 "Операция не может быть завершена. (Ошибка LibrarianErrorDomain 2 - Невозможно отключить синхронизацию для несинхронизированного элемента.)"}


person cfischer    schedule 09.11.2012    source источник
comment
Он возвращает YES? err заселено?   -  person Stephen Darlington    schedule 09.11.2012
comment
Только что отредактировал вопрос   -  person cfischer    schedule 10.11.2012


Ответы (3)


Ошибка довольно ясна. Вы пытаетесь удалить элемент из iCloud, которого нет в iCloud. Если вы хотите удалить элемент из iCloud с помощью setUbiquitous:..., URL-адрес элемента (itemAtURL:) должен быть URL-адресом iCloud. Целевой URL-адрес может быть чем-то локальным (но игнорируется, если для вездесущего установлено значение NO).

person Scott Berrevoets    schedule 14.06.2013

При указании для параметра «setubiquitous» значения «нет» ваш адрес назначения должен быть локальным URL-адресом, а не адресом iCloud. У вас изменились URL-адреса

person Sauceboi    schedule 14.06.2013

Чтобы удалить элемент в iCloud, вы можете попробовать этот код:

NSError *err;
NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
[fileCoordinator coordinateWritingItemAtURL:_url
                                    options:NSFileCoordinatorWritingForDeleting
                                      error:&err
                                 byAccessor:^(NSURL* writingURL) {
                                           NSFileManager* fileManager = [NSFileManager defaultManager];
                                           [fileManager removeItemAtURL:writingURL error:nil];
                                 }];
[fileCoordinator autorelease];

Удачи!

person Tony    schedule 14.06.2013
comment
defaultManager не сохраняет поток. Вы должны использовать новый экземпляр. Кроме того, если блок err != nil byAccessor никогда не будет вызываться, вы также должны проверить это. - person Ben Affleck; 18.12.2015
comment
@Andy Этот вид использования уже давно является потокобезопасным. Методы общего объекта NSFileManager могут безопасно вызываться из нескольких потоков. - person gyratory circus; 25.02.2016