Как вернуть тип данных: NSDictionary в Swift

Я хочу вернуть тип данных: NSDictionary. Но основной код получил пустой NSDictionary.
Как решить эту проблему? Я использовал метод JSON в функции.

    func regionDataReturn(rid: Int) -> NSDictionary {
    var jsonResult: NSDictionary = NSDictionary()
    let urlPath: String = "MY_SERVER/test.php"
    var url: NSURL = NSURL(string: urlPath)!
    var request1: NSMutableURLRequest = NSMutableURLRequest(URL: url)

    request1.HTTPMethod = "POST"
    var stringPost="test_id=\(tid)" // Key and Value

    let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding)

    request1.timeoutInterval = 60
    request1.HTTPBody=data
    request1.HTTPShouldHandleCookies=false

    let queue:NSOperationQueue = NSOperationQueue()

    NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        var err: NSError

        jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

        self.navigationItem.title = jsonResult["name"] as? String
        NSLog("\(self.navigationItem.title)")
    })

    return jsonResult
}

person Sunny Jeon    schedule 09.01.2015    source источник


Ответы (1)


Вы не можете так поступить.

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

  1. Используйте уведомление, передайте обработчик завершения или параметр out, чтобы передать значение обратно вызываемому методу.
  2. Сделайте это синхронным вызовом

var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?> = nil
var error: NSErrorPointer = nil
var data : NSData         =  NSURLConnection.sendSynchronousRequest(request1, returningResponse: response, error:nil)!
var err  : NSError
jsonResult                = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
self.navigationItem.title = jsonResult["name"] as? String
NSLog("\(self.navigationItem.title)")
person Midhun MP    schedule 09.01.2015
comment
Спасибо, я пытался, но ошибка была напечатана. фатальная ошибка: неожиданно найдено nil при распаковке необязательного значения #0 0x00000001001d02e0 в Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> () () - person Sunny Jeon; 09.01.2015
comment
:D Спасибо за ваш ответ. Я решил свою проблему. Я понял, что асинхронный вызов вызывает эту ситуацию. - person Sunny Jeon; 09.01.2015
comment
@SunnyJeon: Добро пожаловать. Асинхронный запрос не будет блокировать ваш поток, это его основное преимущество. Поэтому, если вы используете синхронный запрос, у вас возникнет эта проблема. Так что имейте это в виду. - person Midhun MP; 09.01.2015
comment
Я изучал концепцию асинхронного вызова у профессора 2 года назад, но забыл. Большое спасибо :D - person Sunny Jeon; 09.01.2015