2015-01-31 2 views
0

Я уже спросил об этом на In Swift, how to stop all the process until datas retrieved from parse.com in UICOLLECTIONVIEW. Я не мог получить данные с parse.com перед тем, как выполнить следующую функцию. Я не знаю, как получить доступ к асинхронному потоку. Я объявил, что главная очередь будет «first_fun()», поэтому это должно быть запущено в первую очередь. Аналогично, он работает первым, но заканчивается наконец. Перед этим выполняется следующая функция («second_fun()»). Как выполнить QUEUE этот функциональный блок? Как сначала завершить асинхронный поток? Пожалуйста, проверьте мой код.В Swift, почему GCD не работает с синтаксическим разбором?

МОЙ КОД НИЖЕ:

override func viewDidLoad() { 

println("START") 
let queue : dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
dispatch_async(queue, { 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    self.first_fun() 
    }) 
}) 

second_fun() 
println("END") 

} 

// FIRST_FUN

func first_fun() { 
println("FIRST CLASS TOP") 
self.par_query.findObjectsInBackgroundWithBlock({(NSArray objects, NSError error) in 

if (error != nil) { 
    NSLog("error " + error.localizedDescription) 
} 
else { 

println("WELCOME to PARSE")   

}//ELSE ENDING 

})//PARSE ENDING 
println("FIRST CLASS BOTTOM") 

} 

// SECOND_FUN

func second_fun() { 

println("WELCOME to SECOND") 

} 

ответ

0

Что вы можете сделать, это добавить функцию обратного вызова в first_fun и вызвать second_fun внутри этого обратного вызова следующим образом:

func first_fun(callback:() ->()) { 
    //do something async e.g your call to parse 

    self.par_query.findObjectsInBackgroundWithBlock({(NSArray objects, NSError error) in 
     if (error != nil) { 
      NSLog("error " + error.localizedDescription) 
     } 
     else { 
      println("WELCOME to PARSE")   

     }//ELSE ENDING 
     callback() 
    })//PARSE ENDING 
} 

Ваш viewDidLoad будет выглядеть следующим образом:

override func viewDidLoad() { 
    let queue : dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    dispatch_async(queue, { 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      self.first_fun() { 
       self.second_fun() 
      } 
     }) 
    }) 
} 

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

Справочно: Further info for completion blocks in swift

+0

Hi .. !! Я использовал свой путь. Затем я сомневаюсь в UICollectionView, http://stackoverflow.com/questions/28299481/getting-fatal-error-while-creating-an-instance-for-colectionviewcell. Пожалуйста, направляйте меня. –

1

Суть вашего вопроса «, как я поворачиваю асинхронный дизайн в синхронный ", что не имеет большого смысла. Люди сталкиваются с этой стеной, когда их обучают традиционному процессуальному программированию, а затем пытаются решить проблемы в функциональной/event-системе.

Ответ на ваш вопрос: «Не делай этого». Вы должны изучить новый стиль системного дизайна, где все, что происходит в second_fun(), не зависит от результатов first_fun(). Если первая и вторая действительно зависят от вас, вы должны вызывать second_fun() как последнюю операцию в first_fun().

Например, если у вас есть представление, которое зависит от данных, которые вы вытаскиваете из Интернета (что может быть долгой операцией), вы обычно настраиваете свое представление, чтобы показать индикатор ожидания поворота, а затем вы сделайте свой вызов findObjectsInBackgroundWithBlock(). В обратном вызове вы обрабатываете найденные результаты, инициализируете другие элементы пользовательского интерфейса, а затем заменяете индикатор ожидания на требуемое содержимое.

Вы должны перестать думать процедурно и начать думать функционально.

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