Parse-Server iOS SDK - 创建 returns PFQuery 结果的函数

Parse-Server iOS SDK - Create function that returns results of PFQuery

我的应用程序中有多个地方显示了从服务器 return 编辑的对象列表。我正在尝试重新编写一些代码,以便只需要在一个地方而不是三个地方进行修改以进行更新。

基本要点如下所示:

        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];
        }];

我已经为这个 class 子class编辑了 PFObject,所以我有一个 class 叫做 MyClass。我试图在这个 class 上放置一个 class 方法,return 是一个包含查询结果的 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)')

所以,我知道这个问题是由于这个查询的异步行为造成的。我需要从几个不同的地方调用这个查询,所以希望我可以调用单个函数,但现在我不知道如何使它高效而不是很混乱。我有点倾向于只做三遍,因为这就是我已经在做的事情,但我正在努力学习更好的做法。

有没有办法强制此函数等待 return 直到查询成功?还是传入 sender,然后在 sender 上触发传递结果的函数?我将研究后者,看看它是否有效,但即便如此,这似乎也是迂回的。我想知道我是否遗漏了一些明显的东西。

感谢您的帮助!

注意 - 我更喜欢 Objective C 答案,但如果需要可以使用 Swift 答案。

根据PFQuery.h

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

findObjectsInBackgroundWithBlock 是一个空块,return 什么都没有,所以显然 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
}];