PFCloud callFunctionInBackground:withParameter:block:return 值
PFCloud callFunctionInBackground:withParameter:block: return value
在更改 CalUsed 值时遇到问题我想将 NSNumber *CalUsed1 中的数据放入 CalUsed 以便在其他函数中使用
@property (nonatomic, assign) NSNumber *CalUsed;
- (void) GetCalUsed{
PFUser *user = [PFUser currentUser];
[PFCloud callFunctionInBackground:@"CalUsed"
withParameters:@{@"user": user.objectId}
block:^(NSNumber *CalUsed1, NSError *error) {
if (!error) {
NSLog(@"Calories : %@",CalUsed1);
CalUsed = CalUsed1;
}
CalUsed = CalUsed1;
NSLog(@"TDEE IN FN is : %@",CalUsed);
}];
}
- (void) TestPrint{
NSLog(@"TDEE OUT FN : %@",CalUsed);
}
结果
TDEE 输出 FN:(空)
卡路里:700
FN 中的 TDEE:700
但我需要全局变量 "CalUsed" 将值更改为 700
一些 Parse 方法中有一个 block
。因为检索数据总是会有延迟,所以在检索数据之前需要有人负责应用程序 "waits"。不幸的是,没有简单的方法可以做到这一点,所以 block
在那里,所以它里面的任何东西都会 运行 在数据被检索后。如果您将 NSLog
放入块中,它应该可以工作。
您必须记住,任何程序的目标都是尽可能快地执行代码。因此,当您调用 Parse 方法时,它下面的任何内容(不在 block
中)将继续到 运行.
更新
如果你打算使用 Parse,你必须了解以下内容(如果你不这样做,那么使用 Parse 是没有用的)。任何具有 block
的解析函数的行为都将与您预期的不同。
- (void) GetCalUsed{
PFUser *user = [PFUser currentUser];
[PFCloud callFunctionInBackground:@"CalUsed" //This is the Parse function
withParameters:@{@"user": user.objectId}
block:^(NSNumber *CalUsed1, NSError *error) { // This is where the block starts
if (!error) { //if the block retrieves the data with no problem, this will run
NSLog(@"Calories : %@",CalUsed1);
CalUsed = CalUsed1;
}
CalUsed = CalUsed1;
NSLog(@"TDEE IN FN is : %@",CalUsed);
}];
}
关于 callFunctionInBackground
的事情是没有真正的方法来 return 一个值。所以试着按照我的意思去做:当函数被调用时,它会创建一个到 Parse 数据库的请求来检索数据。但无论你的连接有多牢固,总会有延迟(即使是毫秒,也算延迟)。正如我之前所说,编译器希望尽可能快地执行代码,因此这种延迟会导致问题。使用上面的代码,将调用 Parse 函数,但是,当应用程序等待检索数据时,它将继续执行 Parse 方法之外的所有内容。这就是您获取 null
值的原因(callFunctionInBackground
之外的 NSLog
在数据从 Parse returned 之前执行)。为防止这种情况发生,任何涉及 calUsed1
或 calUsed
的内容都必须 进入 block
。就像这样:
- (void) GetCalUsed{
PFUser *user = [PFUser currentUser];
[PFCloud callFunctionInBackground:@"CalUsed"
withParameters:@{@"user": user.objectId}
block:^(NSNumber *CalUsed1, NSError *error) {
if (!error) {
NSLog(@"Calories : %@",CalUsed1);
CalUsed = CalUsed1;
//HERE YOU CAN MANIPULATE THE DATA HOWEVER YOU WISH. YOU CAN CALL A METHOD OR DO SOMETHING ELSE (aka, you can do whatever you want here)
}
}];
}
总而言之,block
中的所有内容只有在检索到来自 Parse 的数据后才会 运行...无论需要多长时间。如果您还有疑问,请随时提问。
在更改 CalUsed 值时遇到问题我想将 NSNumber *CalUsed1 中的数据放入 CalUsed 以便在其他函数中使用
@property (nonatomic, assign) NSNumber *CalUsed;
- (void) GetCalUsed{
PFUser *user = [PFUser currentUser];
[PFCloud callFunctionInBackground:@"CalUsed"
withParameters:@{@"user": user.objectId}
block:^(NSNumber *CalUsed1, NSError *error) {
if (!error) {
NSLog(@"Calories : %@",CalUsed1);
CalUsed = CalUsed1;
}
CalUsed = CalUsed1;
NSLog(@"TDEE IN FN is : %@",CalUsed);
}];
}
- (void) TestPrint{
NSLog(@"TDEE OUT FN : %@",CalUsed);
}
结果
TDEE 输出 FN:(空)
卡路里:700
FN 中的 TDEE:700
但我需要全局变量 "CalUsed" 将值更改为 700
一些 Parse 方法中有一个 block
。因为检索数据总是会有延迟,所以在检索数据之前需要有人负责应用程序 "waits"。不幸的是,没有简单的方法可以做到这一点,所以 block
在那里,所以它里面的任何东西都会 运行 在数据被检索后。如果您将 NSLog
放入块中,它应该可以工作。
您必须记住,任何程序的目标都是尽可能快地执行代码。因此,当您调用 Parse 方法时,它下面的任何内容(不在 block
中)将继续到 运行.
更新
如果你打算使用 Parse,你必须了解以下内容(如果你不这样做,那么使用 Parse 是没有用的)。任何具有 block
的解析函数的行为都将与您预期的不同。
- (void) GetCalUsed{
PFUser *user = [PFUser currentUser];
[PFCloud callFunctionInBackground:@"CalUsed" //This is the Parse function
withParameters:@{@"user": user.objectId}
block:^(NSNumber *CalUsed1, NSError *error) { // This is where the block starts
if (!error) { //if the block retrieves the data with no problem, this will run
NSLog(@"Calories : %@",CalUsed1);
CalUsed = CalUsed1;
}
CalUsed = CalUsed1;
NSLog(@"TDEE IN FN is : %@",CalUsed);
}];
}
关于 callFunctionInBackground
的事情是没有真正的方法来 return 一个值。所以试着按照我的意思去做:当函数被调用时,它会创建一个到 Parse 数据库的请求来检索数据。但无论你的连接有多牢固,总会有延迟(即使是毫秒,也算延迟)。正如我之前所说,编译器希望尽可能快地执行代码,因此这种延迟会导致问题。使用上面的代码,将调用 Parse 函数,但是,当应用程序等待检索数据时,它将继续执行 Parse 方法之外的所有内容。这就是您获取 null
值的原因(callFunctionInBackground
之外的 NSLog
在数据从 Parse returned 之前执行)。为防止这种情况发生,任何涉及 calUsed1
或 calUsed
的内容都必须 进入 block
。就像这样:
- (void) GetCalUsed{
PFUser *user = [PFUser currentUser];
[PFCloud callFunctionInBackground:@"CalUsed"
withParameters:@{@"user": user.objectId}
block:^(NSNumber *CalUsed1, NSError *error) {
if (!error) {
NSLog(@"Calories : %@",CalUsed1);
CalUsed = CalUsed1;
//HERE YOU CAN MANIPULATE THE DATA HOWEVER YOU WISH. YOU CAN CALL A METHOD OR DO SOMETHING ELSE (aka, you can do whatever you want here)
}
}];
}
总而言之,block
中的所有内容只有在检索到来自 Parse 的数据后才会 运行...无论需要多长时间。如果您还有疑问,请随时提问。