0

「/testPhoto」のようなパラメーターを渡すかどうかを確認するこの単純なメソッドがあり、それが渡された場合は、変数「testPath」で確認できるパスを持つ単純な画像で答えたいと思います(静的試行用のパス)。現時点では、リクエストを行うと、サーバーから 200 ok ステータスを受け取りますが、データが渡されません (0 バイト)。私が間違っていることを理解する必要があります。testPath に正しいパスが含まれていない可能性がありますか? 私が使用しているパスは、ALAssetslibrary を使用して見つけられます。

- (NSObject<HTTPResponse> *)httpResponseForMethod:(NSString *)method URI:(NSString *)path{

  HTTPLogTrace();

  if ([path isEqualToString:@"/testPhoto"]){
    NSString *testPath = [[NSString alloc] init];
    testPath = @"assets-library://asset/asset.JPG?id=DB96E240-8760-4FD6-B8B4-FEF3F61793B3&ext=JPG";
    NSURL *deviceImageUrl = [[NSURL alloc] initWithString:testPath];
    NSData *imageData = [NSData dataWithContentsOfURL:deviceImageUrl];
    UIImage *deviceImage = [UIImage imageWithData:imageData];

    HTTPDataResponse *photoResponse = [[HTTPDataResponse alloc] initWithData:imageData];
    return photoResponse;
  }

return nil;

}

ありがとう

4

1 に答える 1

1

問題は、アセット ライブラリの URL にアクセスする方法です。これは標準の URL ではなく、assets-library URL からのデータのロードはこのようには機能しません。これを行う方法の例を次に示します: NSURL から NSData を取得する

次のコードは、上記の例に基づいています。私は の専門家ではないALAssetLibraryので、慎重に試してください。アセット ライブラリの非同期動作を再び同期させるには、かなりのコードが必要です。

- (NSObject<HTTPResponse> *)httpResponseForMethod:(NSString *)method URI:(NSString *)path{

    HTTPLogTrace();

    if ([path isEqualToString:@"/testPhoto"]){
        NSData* __block data = nil;

        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        dispatch_queue_t queue = dispatch_get_main_queue();

        ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
        {
            ALAssetRepresentation *rep;
            if([myasset defaultRepresentation] == nil) {
                return;
            } else {
                rep = [myasset defaultRepresentation];
            }
            CGImageRef iref = [rep fullResolutionImage];

            dispatch_sync(queue, ^{
                UIImage *myImage = [UIImage imageWithCGImage:iref];
                *data = UIImageJPEGRepresentation(myImage, 1);
            });

            dispatch_semaphore_signal(sema);
        };
        ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
        {
            NSLog(@"Cant get image - %@",[myerror localizedDescription]);

            dispatch_semaphore_signal(sema);
        };

        NSString *testPath = @"assets-library://asset/asset.JPG?id=DB96E240-8760-4FD6-B8B4-FEF3F61793B3&ext=JPG";
        NSURL *deviceImageUrl = [[NSURL alloc] initWithString:testPath];
        ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init]; //usin ARC , you have to declare ALAssetsLibrary as member variable
        [assetslibrary assetForURL:deviceImageUrl
                       resultBlock:resultblock
                      failureBlock:failureblock];

        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

        dispatch_release(sema);


        HTTPDataResponse *photoResponse = [[HTTPDataResponse alloc] initWithData:imageData];
        return photoResponse;
    }
    return nil;
}
于 2013-08-29T07:58:13.343 に答える