2015-07-17 2 views
-1

Пожалуйста, помогите мне решить эту проблему - после многих (не очень эффективных ...) поиска я не могу сделать это в одиночку.iOS - Swift - sync и async

У меня есть следующие методы:

showLoadingAnimation() 

, чтобы показать загрузки анимации в то время как фоновые задачи выполняются

hideLoadingAnimation() 

скрыть загрузки анимации, как только все фоновые задачи закончены

getUserFacebookData() 

, чтобы получить данные пользователя Facebook

uploadUserFacebookDataToServer() 

загрузить данные пользователя Facebook на сервер (и выполнять с ними задачи).

То, что я хочу, чтобы выполнить:

  1. Обнаруживаются загрузочную анимацию: showLoadingAnimation()
  2. Получить пользовательские данные из Facebook: getFacebookData()
    • Подождите, пока эти данные загружаются
  3. As s Ун как данные Facebook-пользователей в настоящее время загрузки, загрузить эти данные на сервер: uploadUserFacebookDataToServer()
    • Wait снимать черепицу эти данные загружаются
  4. Скрыть загрузочную анимацию: 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 вместе в одном, но это «не элегантно», и я также хотел бы использовать это (синхронной/асинхронной отправки) метод в других частях проекта,

Спасибо, что постарались мне помочь!

+0

ли 'getFacebookData()' и 'uploadUserFacebookDataToServer()' синхронный или асинхронный? У них есть обработчик контура или нет? Покажите декларацию этих методов, пожалуйста, – Kametrixom

+0

На данный момент это простые функции без каких-либо параметров или специальных свойств (например, обработчик завершения). Я застрял, поэтому я не хочу испортить вещи, поэтому я стараюсь как можно проще. И, надеюсь, после вашей помощи я смогу расширить их. – lpasztor

+0

Решена ли ваша проблема? –

ответ

0

[EDIT] Использование dispatch_group_t проверка следующий код

Шаг 1: showLoadingAnimation()

Шаг 2: dispatch_group_t faceBookService = dispatch_group_create();

Шаг 3: dispatch_group_async_enter(faceBookService,queue,^{ getUserFacebookData() // The below given line should be inside completion handler or after the above task has finished dispatch_group_leave(faceBookService); });

Шаг 4: dispatch_group_async_enter(faceBookService,queue,^{ uploadUserFacebookDataToServer() // The below given line should be inside completion handler or after the above task has finished dispatch_group_leave(faceBookService); });

Шаг 5: dispatch_group_notify(faceBookService,dispatch_get_main_queue(),^{ //Called after finishing both tasks. hideLoadingAnimation() });

+0

Hi Deepak Samuel Rajan, спасибо за ваш ответ, я собираюсь проверить это решение как можно скорее! – lpasztor

+0

Я попытался ввести код, но Xcode (Swift) этого не принял, мне пришлось переписать его. Не могли бы вы расширить код, данный Чжи-Вэй Цай, для работы с отправкой? – lpasztor

2

Вы можете использовать обработчики завершения:

func showLoadingAnimation() { 
     self.getUserFacebookData({() -> Void in 
      self.uploadUserFacebookDataToServer({() -> Void in 
       self.hideLoadingAnimation() 
      }) 
     }) 
    } 

    func getUserFacebookData(completionHandler:() -> Void) { 
     println("getUserFacebookData") 
     completionHandler() 
    } 

    func uploadUserFacebookDataToServer(completionHandler:() -> Void) { 
     println("uploadUserFacebookDataToServer") 
     completionHandler() 
    } 

    func hideLoadingAnimation() { 
     println("hideLoadingAnimation") 
    } 

После showLoadingAnimation() называется, остальное будет сделано асинхронно.

Ссылка: https://developer.apple.com/library/ios/featuredarticles/Short_Practical_Guide_Blocks/

+0

Спасибо, Чжи-Вэй Цай. Я последовал твоему совету, теперь порядок звонков в порядке, но теперь другая проблема возникла. Пожалуйста, прочтите мое обновление. Спасибо! – lpasztor

+0

Мне нужно будет увидеть код getUserFacebookData(), чтобы узнать, что происходит. Какой класс подключения вы использовали? NSURLSession? NSURLConnection? Один - асинхронный, а один - синхронизация. Если это асинхронно, вам нужно будет поместить следующий блок в блок обработчика завершения соединения. –

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