2016-07-09 2 views
1

Здесь я имею дело с проблемой. Я делаю запрос (внутри функции) в таблице в Parse, и я получаю некоторые объекты. Я подталкиваю их в массив.Быстрое выполнение функций

В ViewDidLoad я имею следующий порядок

override func viewDidLoad() { 
     super.viewDidLoad() 

    refreshControl = UIRefreshControl() 
    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh") 
    refreshControl.addTarget(self, action: #selector(Images.refresh), forControlEvents: UIControlEvents.ValueChanged) 
    self.imagesCollView!.addSubview(refreshControl) 
    queryLikes() // it calls first the likes query 
    queryImages("") // and when the previous query has done, it should run this query. 
} 

и в cellForItemAtIndexPath я проверку, если идентификатор объекта изображения находится внутри массива из ObjectIds, а затем изменить фон кнопки из не понравилось. Все хорошо до сих пор, но я также есть функция обновления, которая что-то подобное

@IBAction func refreshButt(sender: AnyObject) { 
    queryLikes() //this first call to the query of likes table 
    searchBar.text = "" 
    categoryStr = "" 
    queryImages("") //and when the previous query is ready, it should run this query. 
} 

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

Есть ли какой-нибудь рабочий пример, чтобы показать мне, как сделать queryLikes работает ВСЕГДА, и когда он будет завершен, чтобы запустить queryImages ??

Большое спасибо!

ответ

3

Вы можете добиться этого с помощью функции обратного вызова и цепочки запросов:

enum Result<T> { 
    case Success(T) 
    case Failure(NSError) 
} 


func queryLikes(completion: Result<Void> -> Void) { 
    if networkCallSuccess() { completion(.Success()) } 
    else { completion(.Failure(.Error)) } 
} 

queryLikes() { result in 
    switch result { 
    case .Success: queryImages() 
    case .Failure(let error): // Handle error 
    } 

} 
+0

при попытке вставить 'завершение (.Success())' 'внутри моего успеха queryLikes' это дает мне сообщение об ошибке' Не могу назвать значение не-функции типа «Результат » (ака «Результат <()>») 'Я поставил' enum' чуть ниже импорта. Я что-то упустил? Вы хотите, чтобы я обновил вопрос с помощью полных функций? –

+1

Теперь я полностью понимаю, что такое завершение в стартовом режиме. Большое спасибо Diogo !! работали как обаяние: D –

2

Это гораздо более простой способ справиться с ситуацией. Но я бы рекомендовал ответ Diogo Antunes, а не этот подход, вы можете пойти с этим, если вы новичок.

func queryLikes(completion: (success : Bool) ->()) { 
    // After putting your statements 
    completion(success: true) 
} 

Если вы имеете дело с любыми условиями внутри функции, попробуйте это.

func queryLikes(completion: (success : Bool) ->()) { 

      if condition { 
       completion(success: true) 
      } 
      else { 
       completion(success: false) 
      } 
     } 

Использование цикла for внутри функции.

func queryLikes(completion: (success : Bool) ->()) { 

      let objects : [Int] = [] 

      for object in 0..<objects.count 
      { 
       if object == objects.endIndex 
       { 
        completion(success: true) 
       } 
      } 
     } 
+1

оба ответа правильные и оба работали! Но я принял ответ диого, потому что он ответил первым. Большое спасибо за вашу помощь: D –

+1

@ KwnstantinosNatsios Нет проблем. Его ответ - предпочтительный способ. –

Смежные вопросы