Я обнаружил проект ggub BSFetchedResultsController github , который является подклассом NSFetchResultsController, который делает то, что Мартин предложил в том, что он сортируется в памяти с использованием произвольного дескриптора сортировки, кроме того, он также регистрирует изменения в контексте и вычисляет любые индекс снова изменяется с учетом произвольного дескриптора сортировки. В целом очень впечатляющий подвиг! Я успешно использовал его для сортировки по расстоянию следующим образом:
BSFetchedResultsController* fetchedResultsController = [[BSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
// create a location to compare distance to, e.g. current location
CLLocation* sourceLocation = [[CLLocation alloc] initWithLatitude:55.87595153937809 longitude:-4.2578177698913855];
// compare the distance from both to the source location
fetchedResultsController.postFetchComparator= ^(id a, id b) {
Venue* v1 = (Venue*)a;
Venue* v2 = (Venue*)b;
double d1 = [v1.coreLocation distanceFromLocation:sourceLocation];
double d2 = [v2.coreLocation distanceFromLocation:sourceLocation];
return [@(d1) compare:@(d2)];
};
NSError *error = nil;
if (![fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
С момента своего старого проекта у него нет ARC, поэтому, когда вы включаете два файла, помните, чтобы отмечать .m с помощью флагов компилятора - fno-objc-arc в Target, Build Phases. Также имейте в виду, что разработчик считает, что код не готов к производству, поэтому обязательно используйте соответствующее тестирование.
В моем коде выше у меня есть переходное свойство coreLocation на моем подклассе объекта управляемого объекта, вы можете видеть как это сделать здесь . Кроме того, расчет расстояний неэффективен, вам может понадобиться кэшировать расстояние в объекте, а не переучитывать его при каждом сравнении.
Наконец, похоже, что этот проект возник из-за вопроса о создателе Daniel Thorpe's Stackoverflow он остался без ответа, заставив его решить проблему и сам отправил единственный ответ, поэтому я думаю, что если вы найдете полезный его проект, вы можете любезно опубликовать свой пост , как и я.
У меня возникает ошибка «Для этой операции должно быть указано значение PartitionKey» при запуске функции
blockquote>В соответствии с этим сообщением об ошибке, я думаю, вам нужно установить partitionKey в вашем
function.json
файле. Пожалуйста, обратитесь к этому списку поддерживаемых свойств .PartitionKey Определяет значение ключа раздела для поиска. Может включать параметры привязки.
blockquote>Вот пример:
{ "name": "inputDocument", "type": "documentDB", "databaseName": "MyDatabase", "collectionName": "MyCollection", "id" : "{queueTrigger}", "partitionKey": "{partition key value}", "connection": "MyAccount_COSMOSDB", "direction": "in" }