Ładowanie UIImage z UIImagePickerControllerReferenceURL

Korzystam z kontrolera UIImagePickerController, aby umożliwić użytkownikom wybranie obrazu z biblioteki obrazów. Następnie chcę rozpocząć lokalizację tego pliku w bazie danych sqlite, aby móc się do niego odwołać później.

Robiłam trochę gogli o tym, jak to zrobić i zbliżam się dość krótko. Wiem, że mogę uzyskać ReferenceURL elementu, wywołując wewnątrz metody delegata:

    NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"]

Daje mi to prawidłowy obiekt NSURL i jeśli wyprowadzę picURL.absoluteString, mogę sprawdzić, czy jest to prawidłowy adres URL do lokalizacji pliku asset-library. Jeśli jednak spróbuję utworzyć obiekt NSData z tym adresem URL, aby z kolei utworzyć UIImage, kod zawiedzie, ponieważ NSData zwraca zero. Na przykład:

    NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"]
    NSString *stringUrl = picURL.absoluteString;
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringUrl]];
    imgMain.image = [UIImage imageWithData:data]

Zdaję sobie sprawę, że jestem tu nieco powtarzalny, ale chodzi o to, aby pobrać ciąg znaków z adresu URL, który mogę przechowywać w sqlite, a następnie użyć tego ciągu później, aby utworzyć obraz (więc powyższy kod reprezentuje ten ciąg myśli).

Znalazłem kilka informacji na temat korzystania z biblioteki ALAssetsLibrary, ale dało mi to wiele ataków, ponieważ wydaje się, że nie działa dobrze w iOS 5 i ARC. Ciągle otrzymuję komunikaty o błędach „Typ odbiornika ALA zestaw na przykład wiadomości jest deklaracją typu forward. Mogę ustawić właściwości pliku, który odwołuje się do ALAsset / ALAssetsLibrary, aby zignorować ARC, który zatrzymuje błąd kompilacji, ale gdy tylko opuszczę blok kodu, dane znikną. Zobacz poniżej:

    NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    __block UIImage *returnValue = nil;
    [library assetForURL:referenceURL resultBlock:^(ALAsset *asset) {
        returnValue = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
    } failureBlock:^(NSError *error) {
       // error handling
    }];
    [library release];

returnValue zwraca poprawny obraz, ale gdy tylko kod zakończy działanie resultBlock, zawartość danych zniknie (tj. returnValue ponownie stanie się zerowy).

Więc moje pytanie brzmi: w jaki sposób użyć UIImagePickerControllerReferenceURL i przekonwertować go na ciąg, który mogę przechowywać w sqlite, a następnie użyć tego ciągu, aby utworzyć poprawny obiekt UIImage w późniejszym czasie?

questionAnswers(1)

yourAnswerToTheQuestion