2015-02-23 59 views
-1

在有問題更改CalUsed值我希望把數據中的NSNumber * CalUsed1到CalUsed用於其他功能PFCloud callFunctionInBackground:withParameter:塊:返回值

@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 OUT FN:(空)

熱量:700

TDEE IN FN:700

但我需要全局變量「CalUsed」更改值爲700

+0

就我所見,您在塊執行前調用TestPrint。 – 2015-02-23 06:39:13

+0

我不明白塊條件 – 2015-02-23 06:49:49

+0

然後去找塊/異步操作教程。 – 2015-02-23 08:02:26

回答

0

某些解析方法中有一個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返回數據之前執行)。爲防止這種情況發生,涉及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內的一切後,才從分析數據被檢索...不管需要多長時間運行。如果您仍有問題,請隨時提問。

+0

如何返回CalUsed1的值以放入CalUsed? – 2015-02-24 09:28:55

+0

@ bosz.KCH我已經更新了我的答案。如果您有任何問題,請告訴我。 – nick9999 2015-02-24 12:29:06

+0

非常感謝。我是初學者,我會很快問你的。 – 2015-02-24 13:30:42