Как использовать асинхронные методы (службы JSON Restful) в iOS?

У меня есть приложение iOS которое sync данные с web service JSON . Этот метод вызывается из внешнего класса (а не UI controller ). Этот класс имеет метод синхронизации и отправляет и извлекает данные без каких-либо проблем. Моя проблема заключается в том, как я могу приостановить интерфейс, пока не получу свой результат.

Ниже приводится представление о коде.

Класс UIController

 let C : Customer = Customer(UserName: UserName!, Password: Password!) let S : Syncronization = Syncronization() S.Sync(C) 

Класс синхронизации

 Class Syncronization : NSObject, NSURLSessionDataDelegate func Sync(C : Customer){ var datastr = "" datastr = "http://192.168.248.134:8008/MobileWeb.svc/GetFirstTimeSync/" + C.UserName + "/" + C.Password let url:NSURL = NSURL(string: datastr)! self.buffer = NSMutableData() let defaultConfigObject:NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() let session:NSURLSession = NSURLSession(configuration: defaultConfigObject, delegate: self, delegateQueue: NSOperationQueue.mainQueue()) let req:NSMutableURLRequest = NSMutableURLRequest(URL: url) req.HTTPMethod = "POST" session.dataTaskWithURL(url).resume() } func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { print("Recieved with data") buffer.appendData(data) } func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { if error == nil { print("Download Successful") print("Done with Bytes " + String(buffer.length)) self.parseJSONA(self.buffer) } else { print("Error %@",error!.userInfo); print("Error description %@", error!.localizedDescription); print("Error domain %@", error!.domain); } } func parseJSONA(data:NSMutableData) { do { let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as! Array<AnyObject> } catch let error as NSError { print("Failed to load: \(error.localizedDescription)") } } 

Я пробовал методы отправки, но я считаю, что не знаю, как использовать это до сих пор, потому что большинство примеров имеют доступ к сервисам и обмену данными в контроллерах пользовательского интерфейса.

Любая помощь приветствуется. благодаря

Если вы правильно поняли, вы хотите что-то сделать в своем пользовательском интерфейсе на основе результата вашего вызова на S.Sync(C)

Один из способов сделать это – включить закрытие в качестве параметра для вашей функции Sync .

Вот как я это сделаю (Отказ от ответственности … Я не проверял все в компиляторе, поэтому на пути могут быть ошибки. Посмотрите, как далеко вы достигнете, а если есть проблемы, просто напишите еще раз :-)):

 enum SynchronizationResult { case Success(Array<AnyObject>) case Failure(NSError) } class Syncronization : NSObject, NSURLSessionDataDelegate { var functionToExecuteWhenDone: ((SynchronizationResult) -> Void)? func Sync(C : Customer, callback: (SynchronizationResult) -> Void){ functionToExecuteWhenDone = callback var datastr = "" datastr = "http://192.168.248.134:8008/MobileWeb.svc/GetFirstTimeSync/" + C.UserName + "/" + C.Password let url:NSURL = NSURL(string: datastr)! self.buffer = NSMutableData() let defaultConfigObject:NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() let session:NSURLSession = NSURLSession(configuration: defaultConfigObject, delegate: self, delegateQueue: NSOperationQueue.mainQueue()) let req:NSMutableURLRequest = NSMutableURLRequest(URL: url) req.HTTPMethod = "POST" session.dataTaskWithURL(url).resume() } func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { print("Recieved with data") buffer.appendData(data) } func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { if error == nil { print("Download Successful") print("Done with Bytes " + String(buffer.length)) self.parseJSONA(self.buffer) } else { print("Error %@",error!.userInfo); print("Error description %@", error!.localizedDescription); print("Error domain %@", error!.domain); let result = SynchronizationResult.Failure(error!) if let functionToExecuteWhenDone = functionToExecuteWhenDone { functionToExecuteWhenDone(result) } } } func parseJSONA(data:NSMutableData) { do { let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as! Array<AnyObject> let result = SynchronizationResult.Success(json) if let functionToExecuteWhenDone = functionToExecuteWhenDone { functionToExecuteWhenDone(result) } } catch let error as NSError { print("Failed to load: \(error.localizedDescription)") let result = SynchronizationResult.Failure(error) if let functionToExecuteWhenDone = functionToExecuteWhenDone { functionToExecuteWhenDone(result) } } } } 

Итак … мы вводим Enum, называемый SynchronizationResult, для обработки результатов выборки данных.

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

func Sync(C : Customer, callback: (SynchronizationResult) -> Void)

Этот метод будет вызываться с помощью SynchronizationResult в качестве параметра и возвращает void.

Мы сохраняем этот обратный вызов в functionToExecuteWhenDone для последующего использования.

В зависимости от того, видите ли вы какие-либо ошибки на этом пути или что-то в этом солнечном свете, мы генерируем разные значения SynchronizationResult на этом пути и вызываем вашу functionToExecuteWhenDone с текущим SynchronizationResult когда мы готовы (когда синтаксический анализ завершен или мы потерпели неудачу)

И в вашем ViewController вы бы сделали что-то вроде

 let C : Customer = Customer(UserName: UserName!, Password: Password!) let S : Syncronization = Syncronization() S.Sync(C) { (result) in switch result { case .Success(let json): //Your code to update UI based on json goes here case .Failure(let error): //Your code to handle error goes here } } 

Надеюсь, это имеет смысл и именно то, что вам нужно.

Вы можете дать классу Sync закрытие обработчика завершения.

В вашем UIViewController :

 S.completion = { information in UIElement.updateWith(information) } 

и, конечно же, вам нужно добавить участника в свой класс Syncronization :

var completion:((information:String)->())!

и вы можете вызвать completion("here's some info!") изнутри parseJSON() или URLSession() класса URLSession()

Вот некоторые сведения о закрытии в Swift

это может помочь вам https://thatthinginswift.com/background-threads/

 let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT dispatch_async(dispatch_get_global_queue(priority, 0)) { // do downloading or sync task here dispatch_async(dispatch_get_main_queue()) { // update some UI with downloaded data/sync data } } 
 let qualityOfServiceClass = QOS_CLASS_BACKGROUND let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) dispatch_async(backgroundQueue, { print("This is run on the background queue") dispatch_async(dispatch_get_main_queue(), { () -> Void in print("This is run on the main queue, after the previous code in outer block") }) }) 

Найдено здесь

  • Несколько объектов Json и 3 строки в веб-службе JSON POST
  • Преобразование словаря со значением в JSON
  • Невозможно получить выгоду от API JSON от Google-Books
  • AlamofireObjectMapper: ошибка сборки responseObject
  • Swift json некоторые клавиши с кавычками некоторые без
  • Поверните быстрый объект в строку JSON
  • Мое приложение получено nil Данные во время HTTPS URLSessionDataTask
  • Сериализация JSON с использованием сети
  • Ответ Parse JSON с SwiftyJSON без сбоев
  • iOS: Завершение приложения из-за неотображенного исключения «NSInvalidArgumentException», причина: «Недопустимый тип в записи JSON (_NSInlineData)»
  • как добавить значения слияния ключей из NSDictionary в NSarray?
  • Interesting Posts

    динамическая высота ячейки в ios, использующая ограничение в программном

    Выполните действие, нажав уведомление Swift

    XCode по-прежнему указывает, что сборка выполняется, когда она не

    Индикатор активности в UINavigationBar

    визуализация диктофона iOS на быстрых

    Как удалить двойные кавычки и скобки из NSString

    Определение глобальных констант в Objective-C

    Одностраничное приложение (SPA), не загружаемое на iOS mobile

    Исправление подлинности Game Center на iOS 8.3

    UIImagePickerController overlayview перевернуто в превью

    Эффективный способ рисования многих фигур в UIScrollView, прокручиваемом и масштабируемом

    Как добавить программный блок слайдов навигации на существующий UiViewController

    Нажмите действие в некоторой части атрибутной строки в iOS

    Является ли приложение безопасности приложений для приложений iOS «означает, что мне нужно переключать API на https?

    SWRevealViewController и другие контроллеры представлений

    Давайте будем гением компьютера.