Является ли CLLocationManager причиной этого сбоя? - PullRequest
1 голос
/ 07 января 2012

У меня есть объект UIPickerView, в котором перечислены магазины на основе указанного «домашнего» местоположения или текущего местоположения (с помощью CLLocationManager).Если последнее реализовано, я делаю NSMutableURLRequest на свой сервер для получения ближайших хранилищ, затем обновляю UIPickerView с полученным списком.

Иногда (и, как ни странно, никогда, когда я нахожусь в «доме»)"местоположение", я буду использовать текущее местоположение, я увижу сборщик обновлений списка, затем приложение сразу вылетает.

Мой код выбора достаточно прост:

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1;
}

-(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if (isHome) {
        return [storesData count];
    } else {
        return [storesDataLoc count];
    }
}

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    if (isHome) {
        return [[storesData objectAtIndex:row] objectForKey:@"STName"];
    } else {
        return [[storesDataLoc objectAtIndex:row] objectForKey:@"STName"];
    }
}

Одна мысль заключалась в том, что он обеспечивает второе, более точное чтение и что я выпускаю то, что, возможно, уже выпустил.Мой код CLLocationManager:

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
if (error.code == kCLErrorLocationUnknown) {
    NSLog(@"Currently unable to retrieve location");
} else if (error.code == kCLErrorNetwork) {
    NSLog(@"Network used to retrieve location is unavailable");
} else if (error.code == kCLErrorDenied) {
    NSLog(@"Permission to retrieve location is denied");
    [locMan stopUpdatingLocation];
    [locMan release];
    locMan = nil;

    // revert segmented controller to Home position
    storeSource.selectedSegmentIndex = 0;
}
if(loadstoresconnection!=nil){
    [loadstoresconnection release];
}
networkView.hidden = TRUE;
isHome = TRUE;
}

- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation {

if (newLocation.horizontalAccuracy >= 0) {
    networkView.hidden = TRUE;
    if (newLocation.horizontalAccuracy < 200) {
        [locMan stopUpdatingLocation];
        [locMan release];
        locMan = nil;
    }

    //call for store list from this location
    NSString *myString = [NSString stringWithFormat:@"http://mywebsite.com/?lat=%f&lng=%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude];
    NSURL *myURL = [[NSURL alloc] initWithString:[myString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
    loadstoresconnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
}

А подходящие методы NSMutableURLRequest:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[responseData release];
[connection release];
networkView.hidden = TRUE;
isHome = YES;
//    [textView setString:@"Unable to fetch data"];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
int i;
NSArray *querydata;

networkView.hidden = TRUE;
[loadstoresconnection release];
if (storesDataLoc!=nil) {
    [storesDataLoc release];
    storesDataLoc = nil;
}
storesDataLoc = [[NSMutableArray alloc] init];
NSString *txt = [[[NSString alloc] initWithData:responseData encoding: NSASCIIStringEncoding] autorelease];
[responseData release];
// put data into variables.
querydata = [txt componentsSeparatedByString:@"<-sl->"];//break up data into data sections: 0 - number of deptsections and names, 1 - list of objects
NSArray *allstoreinfo;
for (i=0; i<[querydata count]; i++) {
    allstoreinfo = [[querydata objectAtIndex:i] componentsSeparatedByString:@"<-as->"];
    [storesDataLoc addObject:[[[NSMutableDictionary alloc] initWithObjectsAndKeys:[allstoreinfo objectAtIndex:0],@"STid",[allstoreinfo objectAtIndex:1],@"STName",[allstoreinfo objectAtIndex:2],@"STAddr",nil] autorelease]];
}
if ([querydata count]>0) {
    [pickerView reload];
    [pickerView selectRow:0 inComponent:0 animated:NO];
    isHome = NO;
}    

}

Мне интересно, почему я вижу, что средство выбора обновляется простодо сбоев.Поскольку это происходит, когда я в дороге, я подозреваю, что это вещь точности, и менеджер местоположения посылает второй результат, вызывая сбой.Есть мысли?

1 Ответ

0 голосов
/ 05 марта 2012

Кажется, я пытался сделать слишком много ярлыков.Когда пользователь нажимает кнопку местоположения, он включает LocationManager, который при каждом результате устанавливает NSURLConnection на мой сервер.Меня привели для обработки всего этого в одном классе, но с несколькими результатами, которые должен вернуть менеджер местоположения, NSURLConnections, казалось, не контролировались.С тех пор я поместил каждый результат менеджера местоположения в свой собственный класс, и все работает честно.Таким образом, нет проблем со сборщиком - в основном это проблема памяти с менеджером местоположения и nsurlconnections.

...