2017-05-01 1 views
0

내 응용 프로그램 내에 서버에서 반환 된 개체 목록을 표시하는 여러 위치가 있습니다. 나는 코드를 다시 작성하려고 노력 중이다. 따라서 업데이트를 위해서 3 개가 아닌 한 곳에서만 수정되어야한다. 나는이 클래스 PFObject 서브 클래 싱 한Parse-Server iOS SDK - PFQuery의 결과를 반환하는 함수 만들기

 PFQuery *query = [PFQuery queryWithClassName:"MyClass"]; 
     //query constraints 
     [query findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) { 
      if(!error) //Do stuff with objects; 
      else [self displayError:error]; 
     }]; 

, 그래서 클래스 MyClass라고 있습니다

기본 요점은 다음과 같습니다. 이 클래스에 쿼리 결과가 포함 된 NSArray *을 반환하는 클래스 메서드를 넣으려고했습니다.

이 오류는 함수의 끝에 나타납니다
+(NSArray *)getListOfMyClass { 
    PFQuery *query = [PFQuery queryWithClassName:"MyClass"]; 
    //query constraints 
    [query findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) { 
     if(!error) return objects; 
     else [self displayError:error]; 
    }]; 
} 

: Control may reach end of non-void block

이 오류가 나타납니다 return objects;에서 그러나, 다음과 같은 기능이 몇 가지 오류가 발생합니다 그래서 Incompatible block pointer types sending 'NSArray * _Nullable (^)(NSArray * _Nullable __strong, NSError * _Nullable __strong)' to parameter of type 'PFQueryArrayResultBlock _Nullable' (aka 'void (^)(NSArray<PFGenericObject> * _Nullable __strong, NSError * _Nullable __strong)')

을, 나는이 문제를 알고 이 쿼리의 비동기 동작 때문입니다. 몇 가지 다른 장소에서이 쿼리를 호출해야하므로 단일 함수를 호출 할 수 있기를 바랬지 만 지금은 어떻게 효율적으로 만들었는지, 매우 엉망이 될 수 있는지에 관해서는 분실했습니다. 나는 단지 3 번에 걸쳐 그것을 수행하는쪽으로 향하고 있습니다. 그것은 제가 어쨌든 이미하고 있었던 것이지만, 더 나은 습관을 배우려고합니다.

이 함수가 쿼리가 성공할 때까지 반환을 기다릴 수있는 방법이 있습니까? 또는 보낸 사람을 전달한 다음 보낸 사람에게 결과를 전달하는 함수를 트리거하는 것이 좋을까요? 나는 그것이 효과가 있는지보기 위해 후자에 관해서 일할 것입니다. 그러나 심지어 그렇게 우연히 보입니다. 나는 분명히 내가 빠진 것이 있는지 궁금 하네.

도움 주셔서 감사합니다.

주 - 필자는 Objective C 답변을 선호하지만 필요한 경우 빠름 대답으로 작업 할 수 있습니다. PFQuery.h에 따르면

답변

1

:

typedef void (^PFQueryArrayResultBlock)(NSArray<PFGenericObject> *_Nullable objects, NSError * _Nullable error); 

findObjectsInBackgroundWithBlock 때문에 분명히, return 문 거 원인 오류 아무 것도 반환하지 않는 빈 블록입니다. 코드에서 다른 곳

+(void)getListOfMyClassWithCompletionBlock:(void (^)(NSError *error, NSArray *objectArray))block { 
    PFQuery *query = [PFQuery queryWithClassName:"MyClass"]; 
    //query constraints 
    [query findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) { 
     if(!error) block(nil, objects); 
     else block(error, nil); [self displayError:error]; 
    }]; 
} 

그리고 (다른 클래스) : 당신이 배열을 검색하려면

, 당신처럼, 완료 핸들러를 사용할 수 있습니다

[YourClass getListOfMyClassWithCompletionBlock:^(NSError *error, NSArray *objectArray) { 
    if (!error) //update your UI with objectArray 
}]; 
+0

이 굉장이 인 내가 찾고있는 추적 응답에 직접. 나는 "작동"할 수있는 몇 가지 다른 해결책에 대해 생각해 보았습니다. 그러나 그들은 매우 우회적이고 해킹 된 것처럼 보였습니다. 나는 더 적절한 방법이있을 것이라고 확신했습니다. 나는 빈 블록을 집어 들었지만, 내가하려고했던 것을 분명하게 보여주는 예제를 보여주고 싶었다. 완료 블록을 사용했지만, 다른 SDK의 완료 블록이있는 함수 만 사용하고 완성 블록을 반환하는 함수는 작성하지 않았습니다. 고마워! –

+0

나는이 쿼리를 LOL이라고 부르는 클래스를위한 프로토콜을 거의 만들었다. 방금 너무 단순한 무언가에 대한 추가 오버 헤드는 ... –

관련 문제