某些解析方法中有一個block
。由於檢索數據總是會有延遲,因此需要有人在應用程序「等待」數據被檢索之前進行「等待」。不幸的是,有沒有簡單的方法來做到這一點,所以block
是在那裏,所以它的任何內容將運行後數據檢索。如果你把NSLog
放在塊裏,它應該可以工作。
你必須記住,任何程序的目標是儘可能快地執行代碼。所以,當你調用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);
}];
}
事情有關callFunctionInBackground
是,有沒有真正的方式返回一個值。所以試着按照我的說法:當函數被調用時,它會創建一個請求到Parse數據庫來檢索數據。但是不管你的連接有多強,總是會有延遲(即使是毫秒級,它仍然算作延遲)。就像我之前說過的,編譯器想要儘可能快地執行代碼,所以這個延遲會導致問題。使用上面的代碼,Parse函數將被調用,但是,當應用程序等待檢索數據時,它將繼續執行Parse方法外的所有內容。這就是爲什麼你得到null
值(callFunctionInBackground
之外的NSLog
在從Parse返回數據之前執行)。爲防止這種情況發生,涉及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
內的一切後,才從分析數據被檢索...不管需要多長時間運行。如果您仍有問題,請隨時提問。
就我所見,您在塊執行前調用TestPrint。 – 2015-02-23 06:39:13
我不明白塊條件 – 2015-02-23 06:49:49
然後去找塊/異步操作教程。 – 2015-02-23 08:02:26