在更改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);
}
RESULT
TDEE OUT FN :( null)
卡路里:700
TDN in FN:700
但我需要全局变量" CalUsed"将值更改为700
答案 0 :(得分:0)
一些Parse方法中包含block
。因为在检索数据时总会有延迟,所以需要有人在应用程序“检索”之前“等待”。不幸的是,没有简单的方法可以做到这一点,因此block
就在那里,所以其中的任何内容都将在检索数据后运行。如果您将NSLog
放入块中,它应该可以正常工作。
您必须记住,任何程序的目标都是尽快执行代码。因此,当您调用Parse方法时,其下方的任何内容都不会继续运行。
<强>更新强>
如果您要使用Parse,您必须了解以下内容(如果不这样做,则使用Parse没有用)。任何具有block
的解析函数的行为都会与您预期的不同。
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);
}];
的事情是没有办法返回一个值。因此,请尝试关注我:调用该函数时,它将向Parse数据库创建一个请求以检索数据。但无论你的连接有多强,总会有一个延迟(即使它是毫秒仍然算作延迟)。就像我之前说的那样,编译器希望尽可能快地执行代码,因此这种延迟会导致问题。使用上面的代码,将调用Parse函数,但是,当app等待检索数据时,它将继续执行Parse方法的所有内容。这就是为什么在从Parse返回数据之前执行callFunctionInBackground
值(null
之外的NSLog
)。为防止这种情况发生,涉及callFunctionInBackground
或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)
}
}];
}
内的所有内容只有在检索到Parse的数据后才会运行...无论需要多长时间。如果您仍有疑问,请随时提出。