2014-10-05 3 views
1

Рассмотрим этот простой метод:PFObject в saveInBackgroundWithBlock: метод - блок не дозвонились

- (void)connectSpouseToCurrentUser:(PFUser *)spouse completionBlock:(void (^)(NSError *error))completionBlock { 
    [PFUser currentUser][@"spouse"] = spouse;   
    [[PFUser currentUser] saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { 
     if (error) { 
      NSLog(@"Error: %@", [error userInfo]); 
     } 

     spouse[@"spouse"] = [PFUser currentUser]; 
     [spouse saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { 
      // This code never executes 
      NSLog(@"Error: %@", error); 
      self.spouse = spouse; 
      if (completionBlock) { 
       completionBlock(error); 
      } 
     }]; 
    }]; 
} 

По некоторым причинам мой последний блок завершения не вызывается.

Кто-нибудь знает, почему это происходит?

+0

Вы установили точку останова, чтобы увидеть, что происходит? – Paulw11

+0

Несомненно, выполнение не останавливается на контрольной точке. –

+0

Где вы установили точку останова? – Paulw11

ответ

0

Вы должны установить свой код внутри успешной атаки или ошибка блока, как это:

if (succeeded) { // like this 
    spouse[@"spouse"] = [PFUser currentUser]; 
    [spouse saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { 
     if (!error) { // or like this 
      // This code never executes 
      NSLog(@"Error: %@", error); 
      self.spouse = spouse; 
      if (completionBlock) { 
       completionBlock(error); 
      } 
     } 
    }]; 
} 
0

У меня такая же проблема, и я нашел только один полезный комментарий по этой теме на форуме синтаксического хелперов. Я попробовал, и это работает. https://www.parse.com/questions/saveinbackgroundwithblock-not-being-called-on-1219

Таким образом, основная проблема заключается в том, что вы создаете указатель от пользователя к супругу, а также от супруга к пользователю. Я знаю, что работать с обоими указателями проще.

В моем случае у меня есть пользователи и сообщения, и все сообщения имеют указатели для пользователей, и все пользователи имеют указатели на последние сообщения. Я удалил последний. Вместо указателя я запрашиваю последнее сообщение из синтаксического анализа, когда мне нужно новое, и сохраняю его как обычную цель.

PFQuery *messageQuery = [Message query]; 
[messageQuery whereKey:@"owner" equalTo:self.createdBy]; 
[messageQuery orderByDescending:@"createdAt"]; 
[messageQuery getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) { 
    if (object && !error) 
    self.user.lastMessage = (Message *)object; 
}]; 

Надеюсь, это поможет вам. Кроме того, я настоятельно рекомендую вам подзаголовку пользовательского разбора. Кодексу намного проще кодировать и иметь хорошее представление о том, что вы делаете.

1

Для людей, которые сталкиваются с этой проблемой с один-ко-многим с использованием массива типа столбца,

Если присвоить массив типа столбца массива, то блок завершения не называется. Однако данные сохраняются. Однако нет возможности визуализировать соединение на панели управления parse.com.

У меня есть два стола, пользователь и образование. Пользователь может иметь несколько объектов образования. В следующем коде блок завершения никогда не вызывается.

import Parse 

var education : [MyEducation] = [MyEducation]() 

let edu1 : MyEducation = MyEducation() 
edu1["schoolName"] = "Stanford" 
edu1["fieldOfStudy"] = "Engineering" 
edu1["startDate"] = NSDate() 
education.append(edu1) 

let edu2 : MyEducation = MyEducation() 
edu2["schoolName"] = "UCLA" 
edu2["fieldOfStudy"] = "Data Science" 
edu2["startDate"] = NSDate() 
education.append(edu2) 

PFUser.currentUser()?["education"] = education 
PFUser.currentUser()?.saveInBackgroundWithBlock{(success: Bool, error: NSError?) -> Void in 
     let a : Int = 1 
} 

Однако, если вы закодируете следующее, вызывается блок завершения.

import Parse 

var education : [MyEducation] = [MyEducation]() 

let edu1 : MyEducation = MyEducation() 
edu1["schoolName"] = "Stanford" 
edu1["fieldOfStudy"] = "Engineering" 
edu1["startDate"] = NSDate() 
edu1["user"] = PFUser.currentUser() 
education.append(edu1) 

let edu2 : MyEducation = MyEducation() 
edu2["schoolName"] = "UCLA" 
edu2["fieldOfStudy"] = "Data Science" 
edu2["startDate"] = NSDate() 
edu2.["user"] = PFUser.currentUser() 
education.append(edu2) 

PFUser.currentUser()?.saveInBackgroundWithBlock{(success: Bool, error: NSError?) -> Void in 
     let a : Int = 1 
} 

Итак, в конце концов, какой подход к выбору - это ваш звонок. Первая делает визуализацию более сложной (или невозможной?) На панели управления, но позже вы можете использовать includeKey («образование») для запросов PFUser.

В последнем подходе вы должны запросить класс Education для полного PFObject, но указатель на пользователя из класса Education отображается на панели управления, а также на этапе завершения.

Я думаю, что Parse не очень хорошо разрабатывал отношения, и это поведение не документировано.