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

Posted

技术标签:

【中文标题】Parse-Server iOS SDK - 创建返回 PFQuery 结果的函数【英文标题】:Parse-Server iOS SDK - Create function that returns results of PFQuery 【发布时间】:2017-05-01 22:03:55 【问题描述】:

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

基本要点如下所示:

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

我为这个类子类化了PFObject,所以我有一个名为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)')

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

有没有办法强制这个函数等待返回,直到查询成功?还是可以传入发件人,然后在发件人上触发传递结果的函数?我将在后者上工作,看看它是否有效,但即使这样看起来也很迂回。我想知道我是否遗漏了一些明显的东西。

感谢您的帮助!

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

【问题讨论】:

【参考方案1】:

根据PFQuery.h

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

findObjectsInBackgroundWithBlock 是一个不返回任何内容的 void 块,因此显然 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
];

【讨论】:

太棒了,这是我正在寻找的直接追逐答案。我曾想过几种不同的解决方案可以“工作”,但它们看起来如此迂回和笨拙,我确信会有更合适的方法。我拿起了 void 块,但想展示这个例子来说明我想要做什么。我使用过完成块,但只使用来自其他 SDK 的完成块的函数,而不是编写我自己的返回完成块的函数。谢谢! 我几乎为尝试调用此查询的类创建了一个协议,哈哈。这么简单的东西需要额外的开销......

以上是关于Parse-Server iOS SDK - 创建返回 PFQuery 结果的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 php parse-server sdk 将 ParseQuery::orQueries 与 matchQuery 结合起来

如何使用 PHP Parse SDK 连接到 mongodb Parse-Server?

Parse-server:iOS 推送通知

将 Objective-C iOS 应用程序迁移到自托管 Parse-Server 的问题

对象未保存在 Parse-Server 上

iOS Swift Parse-Server 用户登录认证