Как да върнете типа данни: 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. Използвайте известие, предайте манипулатор за завършване или изходящ параметър, за да прехвърлите стойността обратно към извикания метод
  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
Благодаря, опитах, но грешката беше отпечатана. фатална грешка: неочаквано намерена нула при разопаковане на опционална стойност #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