2013-07-21 2 views
0

AFNetworking을 사용하여 콘텐츠를 서버에 게시하는 레일 기반 iOS 앱을 구축하고 있습니다. 사용자는 댓글이있는 사진을 업로드 할 수 있습니다. 또한 사용자가 텍스트 만 업로드 할 수있는 옵션을 원합니다. 여기가 문제가되는 곳입니다. 사진과 텍스트를 저장하는 한 가지 방법과 텍스트 만 저장하는 방법이 있습니다. 사진 저장 방법이 작동하지만 텍스트 저장 방법으로 게시물을 만들지 만 텍스트는 null입니다. 사진을 저장 구현은 다음과 같다 : 당신이 photoData, 응용 프로그램 충돌이없는 경우 photoData-있을 때AFNetworking POST가 생성되었지만 비어 있습니다.

- (void)savePhotoAtLocation:(CLLocation *)location 
        withBlock:(void (^)(CGFloat))progressBlock completion:(void (^)(BOOL, NSError *))completionBlock { 

if (!self.content) self.content = @""; 

NSDictionary *params = @{ 
         @"post[content]" : self.content, 
         @"post[lat]": @(location.coordinate.latitude), 
         @"post[lng]": @(location.coordinate.longitude) 

         }; 

NSURLRequest *postRequest = [[APIClient sharedClient] multipartFormRequestWithMethod:@"POST"                    path:@"/posts" parameters:params 
    constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
              { 
               [formData appendPartWithFileData:self.photoData 
                      name:@"post[photo]" 
                     fileName:@"" 
                     mimeType:@"image/png"]; 
              }]; 
    AFHTTPRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:postRequest]; 

이 방법은 작동합니다. 그래서 문자열 만 포함 할 수있는 multipartFormRequest-와 동등한 것이 궁금합니다. 이것은 내가 지금 가지고있는 것입니다. 즉, 포스트를 생성하지만 내용을 반환합니다 : 현재 위치와 함께 반환되어야하는 lat/lng 매개 변수뿐입니다. 이것은 저장 호출이 포스트 모델

- (void)savePostAtLocation:(CLLocation *)location 
    withBlock:(void (^)(CGFloat progress))progressBlock completion:(void (^)(BOOL success, NSError *error))completionBlock { 

    if (!self.content) self.content = @""; 

    NSDictionary *params = @{ 
          @"post[content]" : self.content, 
          @"post[lat]" : @(location.coordinate.latitude), 
          @"post[lng]" : @(location.coordinate.longitude) 
            }; 

    NSURLRequest *postRequest = [[APIClient sharedClient]requestWithMethod:@"POST" path:@"/posts" parameters:params]; 

    AFHTTPRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:postRequest]; 

     [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     if (operation.response.statusCode == 200 || operation.response.statusCode == 201) { 
      NSLog(@"Created, %@", responseObject); 
      NSDictionary *updatedPost = [responseObject objectForKey:@"post"]; 
      [self updateFromJSON:updatedPost]; 
      [self notifyCreated]; 
      completionBlock(YES, nil); 
     } else { 
      completionBlock(NO, nil); 
     } 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     completionBlock(NO, error); 
     }]; 

    [[APIClient sharedClient] enqueueHTTPRequestOperation:operation]; 
} 

에 그리고 AddPostViewController에 정의되어 게시물을 만든 후

- (void)save:(id)sender 

{ 
    CLLocationManager * locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
    self.locationManager.distanceFilter = 80.0f; 
    [locationManager startUpdatingLocation]; 
    [self getLocation]; 
    CLLocation * location = [locationManager location]; 

    Post *post = [[Post alloc] init]; 
    post.content = self.contentTextField.text; 

    [self.view endEditing:YES]; 

    ProgressView *progressView = [ProgressView presentInWindow:self.view.window]; 
    if (location) { 

    [post savePostAtLocation:self.locationManager.location withBlock:^(CGFloat progress) { 
     [progressView setProgress:progress]; 
    } completion:^(BOOL success, NSError *error) { 
     [progressView dismiss]; 
     if (success) { 
      [self.navigationController popViewControllerAnimated:YES]; 
     } else { 
      NSLog(@"ERROR: %@", error); 
     } 
    }]; 
    } else { 
     NSLog(@"No Location"); 
    } 
} 

여기 로그입니다. 보시다시피 속성은 null이며 그렇게해서는 안됩니다.

Created, { 
    post =  { 
     content = "<null>"; 
     "created_at" = "2013-07-21T18:45:12Z"; 
     id = 13; 
     lat = "<null>"; 
     lng = "<null>"; 

    success = 1; 
} 

그래서 게시물이 속성은 null이 생성되지만, 사실은 나에게 문제가 NSURLRequest- 단순히이라고 생각하게하고 나는 완전히 AFNetworking 프로토콜을 구현하지 오전하지만 난 할 수 없었다 fileData를 수반하지 않는 게시물 요청을 구현하는 방법을 찾으십시오. fileData를 추가하지 않는 게시물 요청을하려면 어떻게해야합니까? 도움을 주시면 대단히 감사하겠습니다. 감사합니다.

+0

실제로 아무튼 무엇 '나는 일을 그것을 가지고 어떻게 – Wain

+0

@Wain 게시물이 생성되지만 사전의 매개 변수는 비어 있습니다. 내용은 null뿐만 아니라 lat 및 lng null입니다. 위에서 볼 수있는 성공적인 게시물의 로그를 포함합니다. – grantvansant

+0

사전에 'nil'을 포함 할 수 없습니다. 'nil'을 설정하려고하면 예외가 발생합니다. 서버가 수신 할 것으로 예상되는 것은 무엇입니까, POST 매개 변수를 선택하는 데 문제가 있습니까? – Wain

답변

0

입니다 일하니? 서버가받을 것으로 예상되는 것은 무엇입니까? 네가 묻고있는 것이 분명하지 않다.
1

기존 방법을 복사 할 수 있지만 appendPartWithFileData:name:fileName:mimeType:을 사용하여 파일 데이터를 설정하는 대신 매개 변수를 데이터로 변환하고 appendPartWithFormData:name:과 함께 추가 할 수 있습니다. post.h

+ (void)createNoteAtLocation:(CLLocation *)location 
       withContent:(NSString *)content 
         block:(void (^)(Post *post))block; 

post.m

+ (void)createNoteAtLocation:(CLLocation *)location 
       withContent:(NSString *)content 
         block:(void (^)(Post *post))block 
{ 
    NSDictionary *parameters = @{ @"post": @{ 
              @"lat": @(location.coordinate.latitude), 
              @"lng": @(location.coordinate.longitude), 
              @"content": content 
              } 
            }; 

    [[APIClient sharedClient] postPath:@"/posts" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     Post *post = [[Post alloc] initWithDictionary:responseObject]; 
     if (block) { 
      block(post); 
     } 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     if (block) { 
      block(nil); 
     } 
    }]; 
} 

그리고

마지막으로 createPostViewController의 :

- (void)save:(id)sender 

{ 
    CLLocationManager * locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
    self.locationManager.distanceFilter = 80.0f; 
    [locationManager startUpdatingLocation]; 

    [self getLocation]; 
    CLLocation * location = [locationManager location]; 


    Post *post = [[Post alloc] init]; 
    post.content = self.contentTextField.text; 

    [self.view endEditing:YES]; 

    if (location) { 

     [Post createNoteAtLocation:location withContent:self.contentTextField.text block:^(Post *post) { 
      NSLog(@"Block: %@", post); 
      [self.navigationController popViewControllerAnimated:YES]; 
     }]; 
    } 
관련 문제