setUbiquitous:itemAtURL:destinationURL:error: не премахва елемента от iCloud

Ако изпратя съобщението

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

за премахване на елемент от iCloud, той всъщност не изтрива файла в Ubiquitous Container. Това ли е очакваното поведение?

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

Error Domain=NSCocoaErrorDomain Code=512 "Операцията не можа да бъде завършена. (Грешка в Cocoa 512.)"

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

NSUnderlyingError=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 може да бъде нещо локално (но се игнорира, ако ubiquitous е зададено на NO).

person Scott Berrevoets    schedule 14.06.2013

Когато зададете параметъра „setubiquitous“ на „не“, вашият целеви URL адрес трябва да бъде локалният 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