开发者

how to use sortUsingFunction:context

开发者 https://www.devze.com 2022-12-11 17:12 出处:网络
appdata.items is NSMutableArray. I connot compile This code. Error code is \"prop.173 has an incomplete type\".

appdata.items is NSMutableArray.

I connot compile This code. Error code is "prop.173 has an incomplete type".

NSInteger compareInfo(id aInfo1, id aInfo2, void *context){
  NSDate* info1 = [aInfo1 objectAtIndex:2];
  NSDate* info2 = [aInfo2 objectAtIndex:2];
  return [info1 compare:info2];
}

-(void)saveData{
  NSData* data = [[NSMutableData alloc] init];
  appdata.items = [appdata.items sortUs开发者_StackOverflowingFunction:compareInfo context:NULL];
  NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
  [archiver encodeObject:appdata forKey:DATAKEY];
  [archiver finishEncoding];
  [data writeToFile:[self dataFilePath] atomically:YES];
  [archiver release];
  [data release];
}


Here is some code that might help you, (I spend pretty much time making it working, doc is not really helpfull)

It computes the distance between POI object and a currentLocation and order POI Object from the closest to the fartest from this location

NSInteger compareDistance(id num1, id num2, void *context) 
{

int retour;
// fist we need to cast all the parameters
CLLocation* location = context;
POI* param1 = num1;
POI* param2 = num2;

// then we can use them as standard ObjC objects
CLLocation* locationCoordinates = [[CLLocation alloc] initWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude];
CLLocation* locationPOI1 = [[CLLocation alloc] initWithLatitude:param1.coords.latitude longitude:param1.coords.longitude];
CLLocation* locationPOI2 = [[CLLocation alloc] initWithLatitude:param2.coords.latitude longitude:param2.coords.longitude];
CLLocationDistance distance1 = [locationPOI1 distanceFromLocation:locationCoordinates];
CLLocationDistance distance2 = [locationPOI2 distanceFromLocation:locationCoordinates];

//make the comparaison
if (distance1 < distance2)
    retour = NSOrderedAscending;
else if (distance1 > distance2)
    retour = NSOrderedDescending;
else
    retour = NSOrderedSame;

[locationCoordinates release];
[locationPOI1 release];
[locationPOI2 release];
return retour;

 }

 -(void) orderByProximityFromLocation:(CLLocationCoordinate2D) coordinates
 {
CLLocation* currentLocation = [[CLLocation alloc] initWithLatitude:coordinates.latitude longitude:coordinates.longitude];
[listOfPOI sortUsingFunction:compareDistance context:currentLocation];
[currentLocation release];

 }


The method sortUsingFunction:context: is for NSMutableArray, not NSArray, which sorts the contents of the mutable array. The method you want is sortedArrayUsingFunction:context: which will return a sorted array which you can assign, as you're currently trying to do.

Unless, of course, items is an NSMutableArray, in which case you can call sortUsingFunction:context: but as it doesn't return anything, so you don't assign it to items.

0

精彩评论

暂无评论...
验证码 换一张
取 消