在无响应时处理目标C的错误

时间:2018-10-20 12:55:09

标签: objective-c api nsurlsession

在我的应用中,我使用以下方法从远程服务器POST /获取数据。

     postData = [self sendSynchronousRequest:request returningResponse:&response error:&error];

    - (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
{

    NSError __block *err = NULL;
    NSData __block *data;
    BOOL __block reqProcessed = false;
    NSURLResponse __block *resp;

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable _data, NSURLResponse * _Nullable _response, NSError * _Nullable _error) {
        resp = _response;
        err = _error;
        data = _data;
        reqProcessed = true;
    }] resume];

    while (!reqProcessed) {
        [NSThread sleepForTimeInterval:0];
    }

*response = resp;
*error = err;
return data;

}

我对没有网络连接具有基本的错误处理,并且应用程序将用户定向到没有网络连接的viewController。但是我想考虑一下例如服务器关闭或api的数据格式已更改的情况,只是想知道如何捕获此类错误并防止应用程序崩溃。

1 个答案:

答案 0 :(得分:0)

一些要点:

  • 请勿同步执行请求。传递一个带有应在请求完成时运行的代码的块。没有理由捆绑一个线程等待完成处理程序运行,而且如果该线程基本上像您一样连续运行,那就更糟了。
  • 如果您绝对必须这样做(为什么?),请至少使用信号量,然后等待该信号量。这样一来,您在等待时就不会持续燃烧CPU内核。

避免崩溃的方法是理智地检查返回的数据,例如

  • 检查数据的长度,并确保您没有收到零/空的响应数据。
  • 假设服务器发送JSON响应,将NSJSONSerialization解析包装在@try块中,如果失败或引发异常,则以某种有用的方式处理错误。
  • 通常假定所有数据都是无效的,除非另有证明。检查以确保数据有意义。
  • 如果您负责服务器端,请考虑将API版本作为参数传递,并且在将来进行修改时,请确保仅当响应请求更新API版本的客户端时,才会发生不兼容的更改(或者,发送响应,告知客户需要升级,然后拒绝提供数据。)