Пожалуйста, помогите мне решить эту проблему - после многих (не очень эффективных ...) поиска я не могу сделать это в одиночку.iOS - Swift - sync и async
У меня есть следующие методы:
showLoadingAnimation()
, чтобы показать загрузки анимации в то время как фоновые задачи выполняются
hideLoadingAnimation()
скрыть загрузки анимации, как только все фоновые задачи закончены
getUserFacebookData()
, чтобы получить данные пользователя Facebook
uploadUserFacebookDataToServer()
загрузить данные пользователя Facebook на сервер (и выполнять с ними задачи).
То, что я хочу, чтобы выполнить:
- Обнаруживаются загрузочную анимацию: showLoadingAnimation()
- Получить пользовательские данные из Facebook: getFacebookData()
- Подождите, пока эти данные загружаются
- As s Ун как данные Facebook-пользователей в настоящее время загрузки, загрузить эти данные на сервер: uploadUserFacebookDataToServer()
- Wait снимать черепицу эти данные загружаются
- Скрыть загрузочную анимацию: hideLoadingAnimation()
Теперь моя проблема в том, что я не знаю, как решить эту проблему. Я знаю, что я должен использовать sync и/или async tasks, GCD ... Но я не знаю, как, и я не могу найти правильное руководство к нему.
Может кто-нибудь объяснить это мне через эти функции? Спасибо!
UPDATE:
Спасибо, Zhi-Вэй Цай, которая была такой ответ, что я надеялся.
Теперь, похоже на работу, порядок вызова в порядке, , но теперь проблема такая же, как в начале:
uploadUserFacebookDataToServer()
не ждать, пока
getUserFacebookData
не загружает пользователя данные из Facebook, поэтому он не сможет работать с необходимыми данными, приведенными от
getUserFacebookData
Любая идея? Есть ли что-нибудь, что связано с отправкой?
UPDATE 2:
Как вы просили, вот многочисленные функции. Надеюсь, с этой информацией вы можете помочь мне решить эту проблему и понять весь этот процесс.
func getFacebookUserData(completionHandler:() -> Void)
{
println("getFacebookUserData")
let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
if ((error) != nil)
{
// Process error
println("Error: \(error)")
}
else
{
let userID : NSString = result.valueForKey("id") as NSString!
var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(userID, forKey: "settings_facebookID")
self.facebookID_fromSettings = userID
}
})
и
func getObjectIDfromFacebookID(completionHandler:() -> Void)
{
println("getObjectIDfromFacebookID")
var query = PFQuery(className:"users")
query.whereKey("facebookID", equalTo:facebookID_fromSettings)
println("getObjectIDfromFacebookID: facebookID: " + facebookID_fromSettings)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
println("Successfully retrieved \(objects!.count) scores.")
// Do something with the found objects
if (objects!.count == 0) {
// New user, registering
println("New user, registering")
}
else
{
//User is already regsitered, reading out objectID
println("User is already regsitered, reading out objectID")
}
if let objects = objects as? [PFObject] {
for object in objects {
println("objectID: " + object.objectId)
var objectID: String = object.objectId
println(objectID)
var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(objectID, forKey: "settings_objectID")
}
}
}
}
completionHandler()
}
Таким образом, первая функция получает facebookID от FB-сервера, но этот процесс занимает много времени, это не даст результата сразу. Вторая функция должна работать с этими данными, поэтому она должна «ждать», пока первая не вернет запрошенные данные.
я могу решить эту проблему путем создания этих 2 Fuctions вместе в одном, но это «не элегантно», и я также хотел бы использовать это (синхронной/асинхронной отправки) метод в других частях проекта,
Спасибо, что постарались мне помочь!
ли 'getFacebookData()' и 'uploadUserFacebookDataToServer()' синхронный или асинхронный? У них есть обработчик контура или нет? Покажите декларацию этих методов, пожалуйста, – Kametrixom
На данный момент это простые функции без каких-либо параметров или специальных свойств (например, обработчик завершения). Я застрял, поэтому я не хочу испортить вещи, поэтому я стараюсь как можно проще. И, надеюсь, после вашей помощи я смогу расширить их. – lpasztor
Решена ли ваша проблема? –