2013-08-29 2 views
0

У меня есть этот простой метод, который проверяет, передаю ли я параметр, например «/ testPhoto», и если он передан, я хочу попытаться ответить простым изображением, которое путь, который вы можете увидеть в переменной «testPath» (статический путь для попытки). На данный момент, когда я выполняю запрос, я получаю статус 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

Спасибо за предложения. Я изменяю код, как вы предлагаете. На самом деле журнал возвращается к imageData.length, равному 0. Считаете ли вы, что путь, который я передаю, неверен? – Hieicker

+1

Большое вам спасибо за помощь. Я пробовал ваш код, и есть только две ошибки. Я их исправил, и теперь он работает отлично! Большое спасибо человеку! – Hieicker

Смежные вопросы