Como identificar se um PHAsset não é completamente baixado do iCloud (por isso, preciso solicitar novamente com options.networkAccessAllowed)

Os documentos dizem:

PHImageResultIsInCloudKey: um valor booleano que indica se os dados do material fotográfico estão armazenados no dispositivo local ou devem ser baixados do iCloud. (NSNumber) Se SIM, nenhuma imagem foi fornecida, porque os dados do ativo devem ser baixados do iCloud. Para baixar os dados, envie outra solicitação e especifique YES para a opção networkAccessAllowed.

Mas essa chave sempre é SIM quando um ativo é armazenado na Biblioteca de Fotos do iCloud, mesmo quando já está completamente baixado para o dispositivo (baixado no meu aplicativo, também aberto no aplicativo Fotos).

Se uma imagem não estiver disponível, quero dar ao usuário a possibilidade de fazer o download (mas não faça isso automaticamente, pelo menos não quando não houver Wifi disponível).

Então, como descubro se a imagem precisa ser baixada?

Ainda mais curioso: quando meu bloco de resultadosrequestImageForAsset:targetSize:contentMode:options:resultHandler: é chamado para uma imagem que precisa ser baixada, recebo uma última chamada com requestImage == nil, depois que uma versão menor e degradada foi entregue.

Nesse caso, degradado é NÃO, mesmo que eu não tenha imagem e a imagem ainda precise ser baixada do iCloud, pois apenas uma pequena miniatura do aplicativo Fotos está disponível localmente até o momento.

Testei isso em iPhones e iPads com diferentes versões do iOS 8 (8.1.x, 8.2 beta, 8.3 beta), o comportamento é sempre o mesmo.

Depois de abrir a imagem no aplicativo Fotos, a última chamada do manipulador de resultados tem a imagem em tamanho real, mas PHImageResultIsInCloudKey ainda será YES.

Aqui está um código de como solicito as imagens:

PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
options.networkAccessAllowed = NO;

[self.imageManager requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *requestedImage, NSDictionary *info) {
    // Checking for requestedImage and the info keys here
    // When a full sized image was loaded, the result of PHImageResultIsInCloudKey is still YES
    // When a full sized image couldn't be loaded cause it's in the cloud, isDegraded is NO and PHImageResultIsInCloudKey is YES (as always) and requestedImage is nil
}];

questionAnswers(4)

yourAnswerToTheQuestion