2015-04-30 78 views
1

我有下面的代碼來更新我的對象是已在服務器上更改:解析固定的對象不更新

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

[PFCloud callFunctionInBackground:@"getAllData" withParameters:@{@"LastUpdate": [self getLastSyncDate], @"Scan": @"NO"} block:^(NSArray *result, NSError *error){   
    if (!error) { 
     for (int x = 0; x < result.count; x++) { 
      PFObject *object = [result objectAtIndex:x]; 
      [object unpinInBackgroundWithName:object.parseClassName block:^(BOOL succeeded, NSError *error){ 
       if (!error) { 
        if ([object[@"deleted"] boolValue] != YES) { 
         [object pinInBackgroundWithName:object.parseClassName block:^(BOOL succeeded, NSError *error){ 
          if (x == result.count - 1) { 
           [self performSelector:@selector(reloadTableView) withObject:nil afterDelay:0.3]; 
          } 
         }]; 
        } 
       } 
      }]; 
     } 
     [defaults setObject:[NSDate date] forKey:@"LastSynced"]; 
     [defaults synchronize]; 
    } 
    [self reloadTableView]; 
}]; 

但我的對象不更新。從本地數據存儲調用PFQuery可以顯示舊版本。

有什麼想法?

回答

1

它看起來像你有一堆背景函數嵌套在對方,這是造成賽車錯誤。

這裏是爲您的代碼的操作順序:

  1. 獲取數據
  2. 迭代通過更新每個項目,並保存在後臺的變化(這是關鍵)
  3. 同步
  4. 重新加載

剛剛完成迭代並不是說所有的保存完成 - 你需要等到所有的步驟2保存完成您繼續步驟3之前和4

一個建議的操作順序:

  1. 獲取數據
  2. 設置與對象的數量,另一個全球與已經更新了數全球
  3. 迭代通過每個項目(從0開始)更新,並用功能檢查,看看是否所有的更新完成,即做你的兩個全球平等彼此。 **只有當所有更新完成後,你同步,並重新加載

事情是這樣的:

//Declare these two globally 
int total; 
int complete; 


complete = 0; 
*defaults = [NSUserDefaults standardUserDefaults]; 
[PFCloud callFunctionInBackground:@"getAllData" withParameters:@{@"LastUpdate": [self getLastSyncDate], @"Scan": @"NO"} block:^(NSArray *result, NSError *error){   
    if (!error) { 
     total = result.count; 
     for (int x = 0; x < result.count; x++) { 
      PFObject *object = [result objectAtIndex:x]; 
      [object unpinInBackgroundWithName:object.parseClassName block:^(BOOL succeeded, NSError *error){ 
       if (!error) { 
        if ([object[@"deleted"] boolValue] != YES) { 
         [object pinInBackgroundWithName:object.parseClassName block:^(BOOL succeeded, NSError *error){ 
          self.total++; 
          [self updateCompleteCheck]; 
         }]; 
        } 
       } 
      }]; 
     } 
    } 
}]; 

-(void)updateCompleteCheck 
{ 
    if(total == complete) { 
     //Only when this is done do you know, for certain, the update is really complete 
     [defaults setObject:[NSDate date] forKey:@"LastSynced"]; 
     [defaults synchronize]; 
     [self reloadTableView]; 
    } 
} 
+0

你做到了,非常感謝! – Yoko

+0

高興地幫助:) –