2013-10-15 4 views
0

API 블록 메시지 오류

- (NSArray *)callSwaggerwithStart:(NSNumber *)start andCount:(NSNumber *)count 
{ 
    [api messageWithCompletionBlock:start count:count filter:@"image" completionHandler:^(CustomResponse *output, NSError *error) { 
     if (!error) { 
      return [NSArray arrayWithArray:[[output toDictionary] valueForKey:@"items"]]; 
     } else { 
      NSLog(@"ERROR IN CallApi, %@", &error); 
     } 
    }]; 
    return nil; 
}

나는 다음과 같은 오류를 얻을 다음과 같은 메시지를 보내려고 :

Incompatible block pointer types

Control may reach end of non-void block

블록은 API를 클래스에서, 그리고 I 하나의 컨트롤러에서 여러 번 사용되기 때문에 메서드를 만들고 싶습니다. 중첩 된 NSArray 값을 반환 할 수 없도록 코드를 유지하는 것은 무엇입니까?

+1

이유는'callSwaggerwithStart ...'방법은 반환 값을 가지고 않습니다 다음과 같이

유효한 접근 방식은 또한 callSwaggerWithStart... 비동기을하는 것? 메소드가 리턴 된 후 오랫동안 데이터를 리턴하지 않는 비동기 블록을 다룰 때 그것은 무의미하다. 어떻게 작동하는지 다시 생각해야합니다. – rmaddy

+0

반환 값을 추가 했으므로 제거 할 것입니다. 감사! – aug2uag

답변

1

API 완료 블록은 비동기 적으로 실행되므로 계산 된 모든 내용을 callSwaggerWithStart...의 호출자에게 동기식으로 반환 할 수 없습니다. completionHandler는 메서드가 반환하는 것보다 훨씬 나중에 실행될 가능성이 큽니다.

- (void)callSwaggerwithStart:(NSNumber *)start andCount:(NSNumber *)count completionHandler:(void (^)(NSArray *result, NSError *error))completionHandler 
{ 
    [api messageWithCompletionBlock:start count:count filter:@"image" completionHandler:^(CustomResponse *output, NSError *error) { 
     if (completionHandler) { 
      if (!error) { 
       completionHandler([output toDictionary][@"items"]], error); 
      } else { 
       completionHandler(nil, error); 
      } 
     } 
    }]; 
} 
+1

+1 굉장한 @GP. 블록 용 블록을 처리하는 데이 패턴을 사용하는 것이 좋습니다. – aug2uag

1

-messageWithCompletionBlock:etc: 메서드는 비동기 적으로 나타납니다. 즉, 현재 쓰여져 있으므로 -callSwaggerEtc:이 반환 된 후에 블록이 호출됩니다. 블록 내부의 "return"은 메서드 자체가 아니라 블록에서 반환됩니다. 두 가지 옵션이 있습니다. -callSwaggerEtc:을 사용하여 자체 완료 핸들러를 사용하거나 semaphore을 사용하여 동기시키고 블록이 호출 될 때까지 기다립니다. .

+0

오포 (Ooph), 실수가 그게 무엇 이니? – aug2uag

0

start은 블록이 아니고 NSNumber입니다. 또는 messageWithCompletionBlock:은 정말로 나쁘게 명명되었습니다 ...

completionHandler 반환을 기대하지 않습니다. 또한 블록이기 때문에 거기에서 돌아 오는 것은 블록을 종료하고 포함하는 메소드를 종료합니다.

귀하의 방법으로는 배열을 반환 할 것으로 예상됩니다. 귀하가 잘못 생각한 것입니다. 메서드가 배열을 반환하지 않도록 (예 : 매개 변수로 전달 된 블록을 호출하는 경우) 배열을 다른 방식으로 가져 오도록 디자인을 변경해야합니다.

+0

나는 그것이 나쁘게 명명 된 것으로 의심된다. –