【发布时间】:2014-08-03 09:48:39
【问题描述】:
我正在使用神奇的记录将大量数据保存到我的数据库中。我想将它保存在后台,但它冻结了 UI。我正在使用
保存它[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
} completion:^(BOOL success, NSError *error) {
}];
所以它不应该阻塞用户界面。但我发现它出于某些原因使用主线程来合并更改或类似的东西。如果有人可以提出如何提高效率的解决方案,我将不胜感激。
我正在使用的代码:
- (void)saveRidesForUser:(User *)user fromResponseData:(id)responseData
{
if (![[[responseData valueForKey:@"rides"] class] isSubclassOfClass:[NSArray class]]) {
return;
}
NSArray *rides = [responseData valueForKey:@"rides"];
if (!rides)
return;
NSMutableArray *photoCacheArray = [[NSMutableArray alloc] init];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
User *rideUser = [user MR_inContext:localContext];
for (NSDictionary *rideDictionary in rides) {
Ride *ride = [Ride MR_createEntityInContext:localContext];
ride.title = ([rideDictionary objectForKey:@"title"]) ? [rideDictionary valueForKey:@"title"] : @"";
NSNumber *rideTimeStamp =[rideDictionary objectForKey:@"start_date"];
if (rideTimeStamp)
ride.startDate = [NSDate dateWithTimeIntervalSince1970:[rideTimeStamp doubleValue]];
NSNumber *rideEndTimeStamp =[rideDictionary objectForKey:@"end_date"];
if (rideEndTimeStamp)
ride.endDate = [NSDate dateWithTimeIntervalSince1970:[rideEndTimeStamp doubleValue]];
ride.serverID = [NSNumber numberWithInt:[[rideDictionary objectForKey:@"id"] intValue]];
ride.isPopular = [NSNumber numberWithBool:NO];
if ([rideDictionary objectForKey:@"intervals"]) {
NSArray *intervals = [rideDictionary objectForKey:@"intervals"];
for (NSDictionary *intervalDictionary in intervals) {
RideInterval *interval = [RideInterval MR_createEntityInContext:localContext];
interval.startDate = [NSDate dateWithTimeIntervalSince1970:[[intervalDictionary objectForKey:@"start_date"] integerValue]];
interval.endDate = [NSDate dateWithTimeIntervalSince1970:[[intervalDictionary objectForKey:@"end_date"] integerValue]];
interval.ride = ride;
if ([intervalDictionary objectForKey:@"points"] && ![[[intervalDictionary objectForKey:@"points"] class] isSubclassOfClass:[NSString class]]) {
NSArray *points = [intervalDictionary objectForKey:@"points"];
for (NSDictionary *pointDict in points) {
NSDictionary *pointDictionary = [pointDict dictionaryByReplacingNullsWithStrings];
RidePoint *point = [RidePoint MR_createEntityInContext:localContext];
point.timestamp = [NSDate dateWithTimeIntervalSince1970:[[pointDictionary objectForKey:@"timestamp"] integerValue]];
point.latitude = [NSNumber numberWithDouble:[[pointDictionary objectForKey:@"latitude"] doubleValue]];
point.longitude = [NSNumber numberWithDouble:[[pointDictionary objectForKey:@"longitude"] doubleValue]];
point.distanceFromPrevious = [NSNumber numberWithDouble:[[pointDictionary objectForKey:@"distance_from_previous"] doubleValue]];
point.interval = interval;
}
}
}
}
if ([rideDictionary valueForKey:@"photos"] && [[[rideDictionary valueForKey:@"photos"] class] isSubclassOfClass:[NSArray class]]) {
NSArray *photos = [rideDictionary objectForKey:@"photos"];
for (NSDictionary *photoDict in photos) {
NSDictionary *photoDictionary = [photoDict dictionaryByReplacingNullsWithStrings];
RidePhoto *photo = [RidePhoto MR_createEntityInContext:localContext];
photo.caption = [photoDictionary valueForKey:@"caption"];
NSNumber *timeStamp =[photoDictionary objectForKey:@"timestamp"];
if (timeStamp)
photo.timestamp = [NSDate dateWithTimeIntervalSince1970:[timeStamp doubleValue]];
photo.locationLatitude = [NSNumber numberWithDouble:[[photoDictionary objectForKey:@"location_latitude"] doubleValue]];
photo.locationLongitude = [NSNumber numberWithDouble:[[photoDictionary objectForKey:@"location_longitude"] doubleValue]];
photo.serverPath = [photoDictionary objectForKey:@"url"];
photo.imagePath = [NSString getUUID];
photo.ride = ride;
[photoCacheArray addObject:photo];
}
}
ride.user = rideUser;
}
} completion:^(BOOL success, NSError *error) {
[[NSNotificationCenter defaultCenter] postNotificationName:kLTRideServise_RoutesDownloadedNotification object:nil userInfo:nil];
}];
}
提前感谢您的帮助!
【问题讨论】:
标签: ios objective-c core-data magicalrecord