2015-01-08 3 views
0

в моем приложении Я использую JSON, и недавно я сделал сеанс, поэтому, если бы я хотел сделать некоторый HTTP-запрос для получения данных для определенного пользователя, пользователь должен войти в систему раньше (также используется по запросу http). в сафари, когда я ввожу URL-адрес логина, а затем URL-адрес получаемых данных, он делает это по мере необходимости. , но в моем приложении я сначала вызываю логин, а затем URL-адрес для получения данных, но, вероятно, он запускает новый сеанс в каждом запросе url, который заставляет меня получить ошибку и не получать данные. мой URL функция запроса:сохранить сеанс в http-запросе swift

static func urlRequest (adress: String, sessionEnded: (NSDictionary->Void)?){ 
    println(adress) 
    var urli = NSURL(string: adress) 
    var request = NSURLRequest(URL: urli!) 
    var rVal = ""; 
    self.task = NSURLSession.sharedSession().dataTaskWithURL(urli!) {(data, response, error) in 
     var parseError: NSError? 
     let parsedObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, 
      options: NSJSONReadingOptions.AllowFragments, 
      error:&parseError) 
     let po = parsedObject as NSDictionary 
     if let a = sessionEnded{ 
      sessionEnded!(po) 
     } 
    } 
    task!.resume() 

} 

заранее спасибо !!

ответ

0

Вы разделили только половину головоломки с нами, код клиента. Мы не можем прокомментировать, почему приложение не работает с более четким представлением о том, что сервер API. Например, как только вы «входите в систему», как последующие запросы подтверждают, что запрос поступает из действительного сеанса. Кроме того, вы сообщаете, что «каждый запрос URL, который приводит меня к ошибке». Ну, какая ошибка вы получаете? Вы должны быть более конкретными в отношении точных ошибок/сбоев, которые вы получаете. Кстати, вы заходите на какой-то сервис с четко определенным API или сами пишете этот код?


Сказав, что я мог бы предложить несколько уточнений к этому методу:

  1. sessionEnded (который я переименовал completionHandler соответствовать неформальным конвенциям стандарта именования), вероятно, должно вернуть необязательно NSError объект тоже, поэтому вызывающий может определить, была ли ошибка.

  2. Развертывание обработчика завершения sessionEnded может быть упрощено для использования ?.

  3. Когда вы анализируете объект, вы также должны свободно выполнять опциональный литье.

  4. Возможно, вам захочется обнаружить сетевую ошибку (в этом случае data будет nil) и вернуть объект NSError.

  5. Незначительная точка, но я бы, вероятно, также переименовал функцию для соответствия соглашениям об именах какао, используя глагол для запуска имени. Возможно, что-то вроде performURLRequest.

  6. Это ваш вызов, но я был бы склонен иметь метод возврата NSURLSessionTask, так что абонент может использовать этот объект задачи, если он хочет (например, сохранить объект задачи таким образом, чтобы он мог cancel позже если захочет).

Таким образом, что дает что-то вроде:

func performURLRequest (address: String, completionHandler: ((NSDictionary!, NSError!) -> Void)?) -> NSURLSessionTask { 
    let url = NSURL(string: address) 
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in 
     if data == nil { 
      sessionEnded?(nil, error) 
     } else { 
      var parseError: NSError? 
      let parsedObject = NSJSONSerialization.JSONObjectWithData(data, options: nil, error:&parseError) as? NSDictionary 
      completionHandler?(parsedObject, parseError) 
     } 
    } 
    task.resume() 

    return task 
} 

И вы бы вызвать это нравится:

performURLRequest("http://www.example.com/some/path") { responseDictionary, error in 
    if responseDictionary == nil { 
     // handle error, e.g. 
     println(error) 
     return 
    } 

    // use `responseDictionary` here 
} 
Смежные вопросы