ios - NSFetchedresultsController 部分 Name KeyPath 基于当前位置和其他位置之间的范围

标签 ios iphone objective-c core-data nsfetchedresultscontroller

我有一个包含对象的实体。这些对象具有 Latitudelongitude。我还添加了一个 transient attribute range 来计算范围。请看下面的类:

@implementation Relation

@dynamic firstLetter;
@dynamic rel_address;
@dynamic rel_balanceTotal;
@dynamic rel_bank_country_code;
@dynamic rel_bank_number;
@dynamic rel_city;
@dynamic rel_city_id;
@dynamic rel_code;
@dynamic rel_country;
@dynamic rel_country_code;
@dynamic rel_customerProspect;
@dynamic rel_email;
@dynamic rel_expired_total;
@dynamic rel_fax;
@dynamic rel_gsm;
@dynamic rel_name;
@dynamic rel_phone;
@dynamic rel_turnovertotal;
@dynamic rel_vat_country_code;
@dynamic rel_vat_number;
@dynamic rel_website;
@dynamic rel_zipcode;
@dynamic rel_longitude;
@dynamic rel_latitude;
@dynamic range;

-(NSNumber *)range{
    NSNumber *rangeFromCurrentLocation;

    [self willAccessValueForKey:@"range"];
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

    CLLocation *location = [[CLLocation alloc]initWithLatitude:[self.rel_latitude floatValue] longitude:[self.rel_longitude floatValue]];
    CLLocation *location2 = [[CLLocation alloc]initWithLatitude:appDelegate.latitude longitude:appDelegate.longitude];

    CLLocationDistance distance = [location2 distanceFromLocation:location];  //      distance is expressed in meters

    CLLocationDistance kilometers = distance / 1000.0;

    float floatrange = ceil(kilometers / 5.0) * 5;
    rangeFromCurrentLocation = [NSNumber numberWithFloat:floatrange];

    [self didAccessValueForKey:@"range"];
    NSLog(@"RANGE IS %@",rangeFromCurrentLocation);

    return rangeFromCurrentLocation;
}

我想做的是建立一个包含 5 公里、10 公里、15 公里......的部分的列表。 在启动时,我只加载半径为 5 公里的关系。我是这样做的。

_searchDistance = 2.50;
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

float minLat = appDelegate.latitude - (_searchDistance / 69);
float maxLat = appDelegate.latitude + (_searchDistance / 69);
float minLon = appDelegate.longitude - _searchDistance / fabs(cos(appDelegate.longitude / 180.0 * M_PI)*69);
float maxLon = appDelegate.longitude + _searchDistance / fabs(cos(appDelegate.longitude / 180.0 * M_PI)*69);

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Relation" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"rel_latitude <= %f AND rel_latitude >= %f AND rel_longitude <= %f AND rel_longitude >= %f", maxLat, minLat, maxLon, minLon];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"rel_name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sort,nil]];

这工作正常,我只得到 5 公里半径 内的对象。在我的 tableView 底部,我有一个 load more 按钮,我在其中更改了 _searchDistance(我又添加了 5km)

为了构建我的列表,我使用了这个 NSFetchedresultController:

NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:context sectionNameKeyPath:@"range"
                                                   cacheName:nil];

问题

当 View 加载时,一切正常。但是当我点击加载更多时,我得到一个空列表并在我的日志中得到这个错误

CoreData: error: (NSFetchedResultsController) The fetched object at index 6 has an out of order section name '10. Objects must be sorted by section name'
2014-04-23 12:01:27.673 Adsolut[2097:60b] Unresolved error Error Domain=NSCocoaErrorDomain Code=134060 "The operation couldn’t be completed. (Cocoa error 134060.)" UserInfo=0x167630f0 {reason=The fetched object at index 6 has an out of order section name '10. Objects must be sorted by section name'}, {
    reason = "The fetched object at index 6 has an out of order section name '10. Objects must be sorted by section name'";

任何帮助将不胜感激! 提前致谢!

最佳答案

问题在于所有对象首先根据第一个排序描述符进行排序, 然后根据 sectionNameKeyPath 分组为多个部分。 documentation关于此参数的说明:

If this key path is not the same as that specified by the first sort descriptor in fetchRequest, they must generate the same relative orderings.

这意味着您必须使用第一个排序描述符来对所有对象进行排序 根据他们到当前位置的距离。不幸的是,这种排序描述符 只能使用 persistent 属性。但是(据我所知)没有办法解决这个问题 如果您使用获取的结果 Controller ,则限制。

关于ios - NSFetchedresultsController 部分 Name KeyPath 基于当前位置和其他位置之间的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23241478/

相关文章:

ios - 如何使计时器在 swift 中与循环一起工作?

ios - 无法将 QLPreviewController 添加为 childViewController iOS10

objective-c - NSNumber numberWithInt : is causing memory leak-Xcode

iphone - 当我将触摸事件传递给 super View 时,MyScrollView 不响应触摸

objective-c - 调用 -drawRect 后如何在 UIView 中绘制文本

ios - 将图钉添加到 MapView 时的委托(delegate)方法

iphone - 在应用程序设置中设置 iPhone 应用程序语言有效,但应用程序名称不会更改

ios - 如何在 Objective-c ios 中抑制 PMD 重复?

iphone - NSURLConnection 固有的内存泄漏?

objective-c - Objective C 某些 NSString 不会转换为 NSCFString