2014-11-12 4 views
1

AFNetworking을 사용하여 iOS를 코딩 할 때이 문제가 여러 번 발생했지만 지금까지 해결 방법을 찾지 못했습니다.완료 블록이있는 Objective-C 메소드가 완료 블록에서 사용하려는 값을 반환합니다.

기본적으로 호출 완료 블록에서 사용할 주 스레드에 값을 반환하는 API 호출을 만들고 싶습니다.

특히, 게시 할 #tags 및 @ 태그와 연결된 게시 개체가 있습니다 ( 초기 "트윗"이 내 db에서 생성 된 후). 나는 내가 #tags 및 @tags 게시 매개 변수로 post_id를를 사용해야하기 때문에이 방법의 완성 블록에있을 필요가 : postHashtagsToDB 및 postAttagsToDB의 몸 내부

-(void)postToDB 
{ 
    _postId = [[[ReelRailsAFNClient sharedClient] createPostWithParameters: 
                  @{@"user_id":_userId, 
                   @"caption":_caption} 
              CompletionBlock:^(NSError *error) { 
               if(!error){ 
                [self postHashtagsToDB:_postId]; 
                [self postAttagsToDB:_postId]; 
               } 
              }] postId]; 
    } 

을 _postId는 평가 (없는). postId를 캡처하여 postHashtagsToDBpostATtagsToDB에 어떻게 삽입합니까?

감사합니다,

JA

편집 : 여기

이 createPostWithParameters 내 방법 정의입니다 : CompletionBLock :

- (Post*) createPostWithParameters:(NSDictionary*)parameters 
       CompletionBlock:(AFNClientErrorCompletionBlock)block{ 
    Post *post = [[Post alloc] init]; 

    [self POST:@"posts" parameters:parameters 
     success:^(NSURLSessionDataTask *task, id responseObject){ 
      NSLog(@"Post Created Successfully"); 
      post = responseObject; 
      block(nil); 
    }failure:^(NSURLSessionDataTask *task, NSError *error) { 
      NSLog(@"Post Not Created"); 
      block(error); 
    }]; 
    return post; 
} 
+0

'오류'가 없습니다. – NobodyNada

+0

내가 잘못하지 않는다면 완료 핸들러는 완료 블록 핸들러 내에서 _postId를 사용할 수 없기 때문에 createPostWithParameters가 값을 반환하기 전에 호출합니다. 난, 당신은 postHashtagsToDB 및 다른 스레드에서 다른 스레드에서 완료 블록 처리기 안에 몇 초 지연과 함께 호출해야 createPostWithParameters가 값을 반환 할 수 있습니다. 희망이 도움이 될 수 있습니다. – ldindu

+0

예, 오류가 없습니다. –

답변

6

ReelRailsAFNClient 당신이 제어 클래스를 것으로 보인다 (I 말 그대로 Google에서 한 가지 결과 -이 질문을 찾았습니다. 당신이 그것을 제어하기 때문에 블록의 내용 내에서 사용할 수 있기를 원한다면 완성 블록 API를 수정하여 게시물 ID를 제공하는 것이 좋습니다.

사이드 노트 : 대문자가 앞에있는 클래스가 아닌 것을 이름을 지정하지 마십시오. CompletionBlock은 자유롭지 않습니다. completionBlock 또는 간단히 completion으로 바꿉니다.

편집 : 그것은하는 것이 좋습니다 객체를 반환하는 경우 (Post의 즉, 인스턴스) :

typedef void (^AFNClientErrorCompletionBlock)(Post *post, NSError *error); 

- (void)createPostWithParameters:(NSDictionary*)parameters 
      completionBlock:(AFNClientErrorCompletionBlock)block{ 
    Post *post = [[Post alloc] init]; 

    [self POST:@"posts" parameters:parameters 
    success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSLog(@"Post Created Successfully"); 
     post = responseObject; 
     block(post, nil); 
    }failure:^(NSURLSessionDataTask *task, NSError *error) { 
     NSLog(@"Post Not Created"); 
     block(post, error); 
    }]; 
} 

사이드 참고 :이 같은 수 있도록 API를 수정할 수 있습니다 그것을 _postID이라는 이름으로 지정하지 마십시오. 더 적절한 할당은 _post입니다.

+0

CompletionBlock은 메서드 호출의 일부이므로 camelcase 규칙으로 인해 대문자로 변환됩니다. –

+0

어떻게 그런 식으로 작업할까요? –

+1

'createPostWithParameters'는 대문자로 시작하지 않습니다. Apple 소스 코드에서는 대문자가있는 클래스, 프로토콜 또는 카테고리가 아닌 것은 시작하지 않는 것이 일반적입니다. –