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 之前执行)。为防止这种情况发生,任何涉及 calUsed1calUsed 的内容都必须 进入 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 的数据后才会 运行...无论需要多长时间。如果您还有疑问,请随时提问。