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
}];
我的应用程序中有多个地方显示了从服务器 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
}];