NSDateFormatter导致应用程序因内存问题而终止

时间:2017-06-28 14:14:13

标签: objective-c nsdateformatter

我正在尝试使用NSDateFormatter修复内存消耗/泄漏问题,如果我在下面的代码中注释掉dateFormatter代码工作正常并且消耗大约30-40 MB或内存,但是一旦我启用了日期格式化程序代码相同的代码在1分钟左右内达到2 GB,然后app被杀死。

+(void)fetchPricelistAll:(int)pricelistId :(int)startAtRow :(int)takeNoOfRows;
{
    if ([NWTillHelper isDebug] == 1) {
        NSLog(@"WebServices:fetchPriceList:priceListId = %d", pricelistId);
    }

    NSString *finalURL = [NSString stringWithFormat:@"https://host.domain.com:5443/api/till/tillpricelistv2/%d?StartAtRow=%d&TakeNoOfRows=%d",pricelistId, startAtRow, takeNoOfRows];

    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:finalURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
         if (error != nil) {
             if ([NWTillHelper isDebug] == 1) {
                 NSLog(@"WebServices:fetchPriceList:Transport error %@", error);
             }
         } else {
             NSHTTPURLResponse *responseHTTP;
             responseHTTP = (NSHTTPURLResponse *) response;

             if(responseHTTP.statusCode != 200) {
                 if ([NWTillHelper isDebug] == 1) {
                     NSLog(@"WebServices:fetchPriceList:Server Error %d", (int) responseHTTP.statusCode);
                 }
             } else {
                 NSArray *priceListObjectArray = [NSJSONSerialization JSONObjectWithData:data
                                                                                 options:0
                                                                                   error:NULL];
                 if ([NWTillHelper isDebug] == 1) {
                     NSLog(@"WebServices:fetchPriceList:count = %lu", (unsigned long)[priceListObjectArray count]);
                 }

                 AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];

                 NSOperationQueue *prlQueue = [[NSOperationQueue alloc] init];
                 prlQueue.maxConcurrentOperationCount = 1;

                 NSPersistentContainer *container = appDelegate.persistentContainer;

                 NSArray *arrayOfArrays = [NWTillHelper splitIntoArraysOfBatchSize:priceListObjectArray :1000];

                 for(NSArray *batch in arrayOfArrays) {

                     [prlQueue addOperationWithBlock:^{

                         [container performBackgroundTask:^(NSManagedObjectContext *context ) {
                             context.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy;

                             NSDictionary *priceListObjectDict = nil;

                             //Loop through the array and for each dictionary insert into local DB
                             for (id element in batch) {
                                 priceListObjectDict = element;

                                 NSString *currencyName = [priceListObjectDict objectForKey:@"currencyName"];
                                 NSString *price = [priceListObjectDict objectForKey:@"price"];
                                 NSString *priceIncTax = [priceListObjectDict objectForKey:@"priceIncTAX"];
                                 //NSString *validFrom = [priceListObjectDict objectForKey:@"validFromDate"];
                                // NSString *validTo = [priceListObjectDict objectForKey:@"validToDate"];
                                 NSString *itemId = [priceListObjectDict objectForKey:@"itemID"];

                                 //NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
                                // [dateFormat setDateFormat:@"YYYY-MM-dd'T'HH:mm:ss"];
                                // NSDate *validToDate = [dateFormat dateFromString:validTo];
                                // NSDate *validFromDate = [dateFormat dateFromString:validFrom];

                                 NSManagedObject *newPrlItem = Nil;
                                 newPrlItem = [NSEntityDescription
                                               insertNewObjectForEntityForName:@"PriceList"
                                               inManagedObjectContext:context];

                                 [newPrlItem setValue:itemId forKey:@"itemId"];
                                 //[newPrlItem setValue:validToDate forKey:@"validTo"];
                                // [newPrlItem setValue:validFromDate forKey:@"validFrom"];
                                 [newPrlItem setValue:price forKey:@"price"];
                                 [newPrlItem setValue:priceIncTax forKey:@"priceIncTax"];
                                 [newPrlItem setValue:currencyName forKey:@"currencyName"];

                                 if ([NWTillHelper isDebug] == 1) {
                                     NSLog(@"WebServices:fetchTillData:ItemId in loop = %@", itemId);
                                     NSLog(@"WebServices:fetchTillData:newPrlItem = %@", newPrlItem);
                                     NSLog(@"WebServices:fetchTillData:CoreData error = %@", error);
                                 }
                             }
                             NSError *error = nil;
                             if (![context save:&error]) {
                                 NSLog(@"Failure to save context: %@\n%@", [error localizedDescription], [error userInfo]);
                                 abort();
                             } else {
                                 NSUserDefaults *tillUserDefaults = [NSUserDefaults standardUserDefaults];
                                 [tillUserDefaults setInteger:1 forKey:@"hasPriceList"];
                                 [tillUserDefaults synchronize];
                             }
                             [context reset];
                         }];
                     }];
                 }
             }
         }
     }] resume];
}

如何设置dateFormatter以便在不占用所有可用内存且导致应用终止的情况下使用它?

0 个答案:

没有答案