2016-02-14 2 views
0

У меня есть функция, которая получает данные с сайта api.cURL получить данные не обновляется при изменении данных на сервере

func getData() { 
print("getData is called") 
//create authentication ... omitted 

//create authentication url and request 
let urlPath = "https://..."; 
let url = NSURL(string: urlPath)! 
let request: NSMutableURLRequest = NSMutableURLRequest(URL: url) 
request.setValue("Basic \(base64EncodedCredential)", forHTTPHeaderField: "Authorization") 
request.HTTPMethod = "GET" 

//some configuration here... 

let task = session.dataTaskWithURL(url) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 
    let json = JSON(data: data!) 
} 
    task.resume() 
} 

Я могу получить данные из API, и у меня есть наблюдатель, так что каждый раз, когда приложение переходит на передний план функции GetData() можно вызвать еще раз, чтобы обновить данные.

override func viewDidLoad() { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "willEnterForeground", name: UIApplicationWillEnterForegroundNotification, object: nil) 
} 

func willEnterForeground() { 
    print("will enter foreground") 
    getData() 
} 

Я уверен, что, когда мое приложение выходит на передний план, то GetData() вызывается снова, однако, мои данные не обновляются, даже если данные на сервере API изменилось. Я попытался закрыть приложение и снова открыть его, но он по-прежнему не обновляет данные. Поэтому мне было интересно, может ли кто-нибудь дать мне несколько советов. Любая помощь будет оценена!

+0

Я добавил некоторые точки останова в 'let task = session.dataTaskWithURL (url) {(данные: NSData ?, response: NSURLResponse ?, error: NSError?) -> Пустота в let json = JSON (данные: данные!) } 'и кажется, что мой код попытался извлечь данные (api изменяет данные каждую минуту), однако он получил старые данные, даже если я заметил, что данные на сервере api изменились. Если я отправил приложение на фон в течение длительного времени (около 15 минут), когда он будет перенесен на передний план, данные будут обновлены. – dksl176

ответ

0

Вам необходимо, чтобы это было закрыто с завершением. Это позволит ему выполнить запрос, а затем вызвать перезагрузку «Просмотр таблицы» после того, как вы действительно получили данные обратно из запроса. Это то, что вам нужно изменить на вашем getData() функции

func getData(completion: (json) -> Void)) { 
    print("getData is called") 
    //create authentication url and request 
    let urlPath = "https://..."; 
    let url = NSURL(string: urlPath)! 
    let request: NSMutableURLRequest = NSMutableURLRequest(URL: url) 
    request.setValue("Basic \(base64EncodedCredential)", forHTTPHeaderField: "Authorization") 
    request.HTTPMethod = "GET" 

    //some configuration here... 

    let task = session.dataTaskWithURL(url) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 
      let json = JSON(data: data!) 
    } 
     completion(json) 
} 

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

func willEnterForeground() { 
    print("will enter foreground") 

    getData(completion:{ 
     self.data = json 
     self.tableView.reloadData() 
    }) 
} 

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

Дайте мне знать, если у вас есть еще вопросы.

+0

Привет @ Даниэль, это не работает, у меня все еще есть та же проблема, даже функция getData вызывается снова, когда view didEnterForeground. Я использовал 'dispatch_async (dispatch_get_main_queue())' для обновления метки, когда 'session.dataTaskWithURL (url)' завершает – dksl176

+0

Ahh. Я просто понял, что вам нужно сделать ваш запрос закрытием с блоком завершения, чтобы вы не пытались перезагрузите данные, пока вы их не вернете. –

+0

Я обновил свой ответ для вас. –

0

Я, наконец, узнал, что это не потому, что я не удалял кеш. Затем измените политику кэша.

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