Adding mapview annotations within parse query returns null randomly

旧街凉风 提交于 2019-12-12 02:47:19

问题


I am creating an iOS app using Parse database(asynchronously) to store information that will be used when populating a mapview. I have been trying to figure out what is wrong for a long time and have done plenty of research without any luck. I have, however, found the source of the issue.

In my code, I am querying the parse database in hopes of getting the information I want and then storing the information in a custom pointAnnotation class, which is of type MkPointAnnotation. Each item is stored in an array of pointAnnotations, and once all items in the database have been stored in the array, the annotations are added to MyMapView. --I have tried adding the annotations as they are created, which does not change anything.

The issue I have been having is that randomly, the query will iterate under the for(PFObject *vendor in Vendors) and reach an error, calling NSLog(@"%@", error.debugDescription); which shows (null) in the output log. The amount of objects that return null seems to change each time I run the application, and occasionally it will work as expected. After adding a do while(pointArray.count < query.countObjects), the function will iterate roughly 20-30 times and then will add the correct number of annotations, however, it is extremely inefficient.

Is this an inefficiency within Parse or is there a better way to achieve the expected results?

PFQuery *query = [PFQuery queryWithClassName:@"Vendors"];
    [query orderByDescending:@"updatedAt"];

    [query findObjectsInBackgroundWithBlock:^(NSArray *vendors, NSError *error){
        NSMutableArray *pointArray = [[NSMutableArray alloc] init];

        if (!error) {
            // The find succeeded.
            // Do something with the found objects
            do {
                pointArray = [[NSMutableArray alloc] init];

            for (PFObject *vendor in vendors) {
                NSDate *lastUpdated = vendor.updatedAt;
                NSDate *today = [NSDate date];
                NSDate *newDate = [lastUpdated dateByAddingTimeInterval:86400];

                if (today <= newDate) {

                    PFGeoPoint *point = vendor[@"Location"];
                    NSString *vendor_ID = vendor[@"Vendor_ID"];
                    NSMutableArray *FruitList = vendor[@"Fruits"];
                    NSMutableArray *VeggieList = vendor[@"Veggies"];
                    NSMutableArray *addressArray = vendor[@"Address"];
                    NSString *startHr = vendor[@"Start_Time"];
                    NSString *endHr = vendor[@"End_Time"];
                    Boolean more = false;

                    NSString *moreString = vendor[@"And_More"];
                    if ([moreString  isEqual: @"true"]) {
                        more = true;
                    }


                    CLLocationCoordinate2D location;

                    location.latitude = point.latitude;
                    location.longitude = point.longitude;



                    pointAnnotation *newAnnotation = [[pointAnnotation alloc] init];


                    if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"language"] isEqual:@"ENGLISH"]){
                        FindCartsLabel.text = @"Find Carts within:";
                        MilesTextField.text = @"Show All";
                        milesArray=[[NSArray alloc]initWithObjects:@"Show All", @"1 Mile", @"5 Miles", @"10 Miles", @"20 Miles", nil];
                        AddressBar.placeholder = ENGLISH_Address;
                        newAnnotation.title = @"Good. To. Go. Vendor";
                        newAnnotation.fruits = FruitList;
                        newAnnotation.veggies = VeggieList;
                    }else if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"language"] isEqual:@"SPANISH"]){
                        FindCartsLabel.text = @"Encuentra Carros Dentro:";
                        newAnnotation.title = @"Good. To. Go. Vendedor";
                        AddressBar.placeholder = SPANISH_Address;

                        NSMutableArray *spanishFruitList = [[NSMutableArray alloc]init];
                        for (NSString *current in FruitList) {
                            MilesTextField.text = @"Mostrar Todo";
                            milesArray=[[NSArray alloc]initWithObjects:@"Mostrar Todo", @"1 Milla", @"5 Millas", @"10 Millas", @"20 Millas", nil];
                            if ([current isEqual:@"Apples"]) {
                                [spanishFruitList addObject:SPANISH_Apples];
                            }
                            if ([current isEqual:@"Bananas"]) {
                                [spanishFruitList addObject:SPANISH_Bananas];
                            }
                            if ([current isEqual:@"Citrus"]) {
                                [spanishFruitList addObject:SPANISH_Citrus];
                            }
                            if ([current isEqual:@"Mangos"]) {
                                [spanishFruitList addObject:SPANISH_Mangos];
                            }
                            if ([current isEqual:@"Strawberries"]) {
                                [spanishFruitList addObject:SPANISH_Strawberries];
                            }
                            if ([current isEqual:@"And More"]) {
                                [spanishFruitList addObject:SPANISH_More];
                            }
                        }
                        NSMutableArray *spanishVeggieList = [[NSMutableArray alloc]init];
                        for (NSString *current in VeggieList) {
                            if ([current isEqual:@"Avocados"]) {
                                [spanishVeggieList addObject:SPANISH_Avocados];
                            }
                            if ([current isEqual:@"Broccoli"]) {
                                [spanishVeggieList addObject:SPANISH_Broccoli];
                            }
                            if ([current isEqual:@"Carrots"]) {
                                [spanishVeggieList addObject:SPANISH_Carrots];
                            }
                            if ([current isEqual:@"Squash"]) {
                                [spanishVeggieList addObject:SPANISH_Squash];
                            }
                            if ([current isEqual:@"Onions"]) {
                                [spanishVeggieList addObject:SPANISH_Onions];
                            }
                            if ([current isEqual:@"Tomatoes"]) {
                                [spanishVeggieList addObject:SPANISH_Tomatoes];
                            }
                            if ([current isEqual:@"And More"]) {
                                [spanishVeggieList addObject:SPANISH_More];
                            }
                        }

                        newAnnotation.fruits = spanishFruitList;
                        newAnnotation.veggies = spanishVeggieList;
                    }

                    newAnnotation.coordinate = location;
                    newAnnotation.vendorID = vendor_ID;
                    newAnnotation.startHour = startHr;
                    newAnnotation.endHour = endHr;
                    newAnnotation.loc = point;
                    newAnnotation.isCustomAddress = false;

                    //newAnnotation.subtitle = address;
                    __block NSString *address = [NSString stringWithFormat:@"%@ %@, %@, %@, %@",
                                                 addressArray[0], addressArray[1],
                                                 addressArray[2], addressArray[3],
                                                 addressArray[4]];

                    __block NSString *currAddress = [NSString stringWithFormat:@"%@ %@\n"
                                                     "%@, %@, %@\n"
                                                     "%@\n",
                                                     addressArray[0], addressArray[1],
                                                     addressArray[2], addressArray[3],
                                                     addressArray[4], addressArray[5]];

                    newAnnotation.subtitle = address;

                    newAnnotation.addressFormatted = currAddress;


                    static NSString *identifier = @"MyLocation";
                    MKPinAnnotationView *currentView = [[MKPinAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:identifier];
                    [pointArray addObject:currentView];



                } else {
                    //[self viewDidLoad];
                    NSLog(@"%@", error.debugDescription);
                }
                //} ];



            }
        } while (pointArray.count < query.countObjects);

        }
        if (pointArray.count == query.countObjects) {
            for (MKPinAnnotationView *currentPoint in pointArray) {
                [self.MyMapView addAnnotation:currentPoint.annotation];
            }
        }

    }];

Thanks in advance for the help. I do not really understand why this code would not complete after only one iteration.


回答1:


The NSLog(@"%@", error.debugDescription); doesn't look like it's in the right place. It's in an else block that is associated with the if (today <= newDate) which is inside a block of code that is only executed if error is null which is why it says null in the log (when what it really means is "today > newDate"). – Anna



来源:https://stackoverflow.com/questions/23585584/adding-mapview-annotations-within-parse-query-returns-null-randomly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!