2013-08-29 3 views
0

"/ testPhoto"와 같은 매개 변수를 전달하는지 확인하는 간단한 방법이 있습니다. 전달 된 경우 간단한 이미지로 대답하려고합니다. 변수 "testPath"(try의 정적 경로)에서 볼 수있는 경로입니다. 현재 요청을하면 서버로부터 200 OK 상태가 수신되지만 데이터는 전달되지 않습니다 (0 바이트). 나는 내가 뭘 잘못하고 있는지 이해할 필요가있어. testPath에 올바른 경로가 포함되지 않았습니까? 내가 사용하고있는 경로는 ALAssetslibrary를 사용하여 찾을 수 있습니다.Objective-C/CocoaHTTPServer - 이미지 반환 방법

- (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; 

} 

감사

답변

1

문제는 당신이 자산 라이브러리 URL에 액세스하는 방법입니다. 이것은 표준 URL이 아니며 자산 라이브러리 URL에서 데이터를로드하는 방식이 이와 같이 작동하지 않습니다. 여기에 예제가 있습니다 : Getting NSData from an NSURL

다음 코드는 위의 예를 기반으로합니다. 나는 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; 
} 
+0

감사합니다. 내가 제안한 코드를 수정했습니다. 실제로 로그는 0과 같은 imageData.length로 돌아갑니다. 제가 전달하는 경로가 잘못되었다고 생각합니까? – Hieicker

+1

도와 주셔서 대단히 감사합니다. 귀하의 코드를 시도한 결과 두 가지 오류 만 있습니다. 나는 그 (것)들을 고치고 지금 완벽하게 작동한다! 대단히 고마워! – Hieicker