2016-01-28 3 views
1

Я использую завершение для всех своих методов, чтобы гарантировать, что поток выполнения контролируется. Однако в очень странном случае это, похоже, не применяется. В TableViewController (TVC), когда пользователь нажимает на строку, в didSelectRowAtIndexPath, я извлекаю информацию о пользователе, а затем проверяю другой метод для условия. За исключением запуска загрузки, но до его завершения происходит метод проверки. Как это может произойти? и как я могу это исправить?Swift - Методы не работают

Вот код в didSelectRowAtIndexPath:

self.getFriendObjectDataFromBackend(self.notificationObject.from!, completion: { (result)->Void in 
       if(result.domain == "") 
       { 
        print(self.friendObject.name) 
        self.checkIfRequestAlreadyAccepted({ (result)->Void in 
         if(result == true) 
         { 
         ... 
         } 
        }) 
       } 
}) 

для getFriendObjectDataFromBackend (..):

func getFriendObjectDataFromBackend(toUser:String, completion:(result:NSError) -> Void) 
{ 
    ..... 
} 

и checkIfRequestAlreadyAccepted (..):

func checkIfRequestAlreadyAccepted(completion: (result:Bool) -> Void) 
{ 
    ..... 
} 

Ошибка быть запускается в checkIfRequestAlreadyAccepted, где я полагаюсь на использование значения глобального варианта способный установить getFriendObjectDataFromBackend.

Заранее благодарим за помощь.

Обновление: Добавлен код для getFriendObjectDataFromBackend:

func getFriendObjectDataFromBackend(toUser:String, completion:(result:NSError) -> Void) 
    { 
     var errorFound:NSError = NSError(domain: "", code: 0, userInfo: nil) 
     let query: PFQuery = PFQuery(className: "_User") 
     query.whereKey("appUsername", equalTo: toUser) 
     query.findObjectsInBackgroundWithBlock { 
      (objects:[PFObject]?, error:NSError?) -> Void in 
      if(error == nil) 
      { 
       completion(result: errorFound) 
       self.friendObject.username = objects![0]["appUsername"] as? String 
       self.friendObject.name = objects![0]["appUsername"] as? String 
      }else{ 
       errorFound = error! 
       completion(result: errorFound) 
      } 
     } 
    } 
+0

Вы можете написать код для 'getFriendObjectDataFromBackend'? Код внутри этого будет определять, когда вызывается функция завершения и что может происходить в то же время. – Putz1103

+0

@ Putz1103 обновил сообщение :) –

+0

Вы вызываете 'завершение (result: errorFound)' * before *, вы устанавливаете глобальные значения на 'self.friendObject' – Paulw11

ответ

1

Вы вызываете завершения (результат: errorFound), прежде чем устанавливать глобальные значения на self.friendObject. Вы должны убедиться, что все установлено, а затем вызвать обработчик завершения.

if (error == nil) 
{  
    self.friendObject.username = objects![0]["appUsername"] as? String 
    self.friendObject.name = objects![0]["appUsername"] as? String 
    completion(result: errorFound) 
} else { 
    errorFound = error! 
    completion(result: errorFound) 
} 
Смежные вопросы