iOS应用崩溃恢复方法

时间:2015-11-13 07:38:58

标签: ios objective-c uitableview asynchronous download

从2年开始,我一直在尝试不同的方法来找到应用程序崩溃的解决方案,同时点击后退按钮。

我的应用场景:

在tableview控制器中我必须加载用户列表,在视图上加载我调用getData(Asyncronous download)API方法来加载数据。在数据下载时,如果用户按下后退按钮,我的应用程序会因空值对象而崩溃。这说明我的所有可变内存都已取消分配。

为了克服这个问题,我使用了一些加载指示器来锁定UIScreen,直到下载数据。

问题:

  1. 有没有其他方法可以防止崩溃,UIScreen Lock
  2. 其他应用程序使用菜单栏中的活动指示器而不使用UIScreen Lock。他们是怎么做的?
  3. 需要帮助来恢复此问题

    以下是我下载数​​据的示例代码: 下面的代码不会崩溃应用程序。但即使我取消对dealloc的操作,它也会下载数据 的 viewDidLoad中:

    ShowNetworkActivityIndicator();
    _processQueue = [[NSOperationQueue alloc] init];
    _processQueue.maxConcurrentOperationCount = 4;
    _processQueue.name = @"Events Processing";
    [self loadData];
    

    loadData:

    - (无效)loadData {     [_processQueue addOperationWithBlock:^ {

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setURL:[[NSURL alloc] initWithString:@"https://restcountries.eu/rest/v1/all"]]; 
        NSURLResponse *response;
        NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
    
        NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
    
    
    
        NSDictionary *search = [NSJSONSerialization JSONObjectWithData:[data dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil];
    
        [[NSOperationQueue mainQueue] addOperationWithBlock: ^ {
            _countryListArray=[search mutableCopy];
            [self.tableViewSample reloadData];
            HideNetworkActivityIndicator();
        }];
    
    }];
    

    }

    我在dealloc中尝试了cancelAllOperations:

    [_processQueue setSuspended:YES];
    [_processQueue cancelAllOperations];
    

1 个答案:

答案 0 :(得分:0)

你可以尝试插入重装数据是dispatch_async(dispatch_get_main(),void(^){});回调,主线程,我认为在后台线程中发生的重载正在崩溃应用程序。

[[NSOperationQueue mainQueue] addOperationWithBlock: ^ { _countryListArray=[search mutableCopy]; dispatch_async(dispatch_get_main_queue(), ^{ [self.tableViewSample reloadData]; HideNetworkActivityIndicator(); });}];