parserDidEndDocument застрял в бесконечной петле - PullRequest
0 голосов
/ 21 февраля 2012

Я анализирую два больших объема данных с моего веб-сервера, у меня возникло несколько проблем, но я думаю, что заблокировал их для одной проблемы, обнаруженной в методе parserDidEndDocument.

что происходит, когда я получаю if (dataSetToParse == @ "vent") Я застреваю в этом цикле, если я регистрирую результаты, он просто постоянно продолжает печатать один и тот же набор результатов для журнала снова и снова.

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    if (dataSetToParse == @"shaft"){        
        //Filter results shaft (isShaft = T)
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"isShaft",@"T"];
        NSArray *filteredArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate]; 

        //Load filteredArray into shaftFilterArray, which can be used outside of this method and passed to other views
        shaftFilterArray = filteredArray;

        [self.tableView reloadData]; //Reloads the tabel delegate methods

    }
    if (dataSetToParse == @"vent"){  
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"ventID",isShaftString]; //isShaftString is being set from the sub view when the user makes a isShaft selection
        NSArray *filteredArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate];


        if ([filteredArray count] == 0){ //<<---- getting stuck in this if statment
            self.removeActivityIndicator = NO; // sets indicator to be turned off once tableview has been reloaded, (tableView:cellForRowAtIndexPath:) and there are no values in the array i.e.(manufacture has no modles)
        }else if([filteredArray count] !=0){
            ventFilterArray = filteredArray; // ventFilterArray is passed to subview to be displayed
        }
        [self setRequestString:@"drain.xml"]; //Sets up the rest for submodel data that needs to be sent to subview with vent data
        [self.tableView reloadData]; //Reloads the tabel delegate methods
    }
}

## UPDATE

Я выяснил, почему мой парсер кажется застрявшим в бесконечном цикле, потому что он вызывается из моего делегата соединения бесконечно ..

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // do something with the data
    // receivedData is declared as a method instance elsewhere
    NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
    if (dataSetToParse == @"shaft"){
        NSData *responseData = [shaftCachedResponse data];
        [self startTheParsingProcess:responseData];
    }
    else if (dataSetToParse == @"vent"){
        NSData *responseData = [ventCachedResponse data]; //<<--- this is where things are getting stuck! with no idea why.
        [self startTheParsingProcess:responseData];
    }
}

не уверен, почему это происходит.

## ОБНОВЛЕНИЕ 2

Итак, я проследил делегатов соединения, чтобы увидеть, в каком порядке они вызывались и сколько раз они вызывались. и вот что происходит

для первого dataSetToParse - "вал" работает следующим образом

  • setRequestString
  • подключение: didReciveResponse:
  • подключение: didReceiveData:
  • connection: willCacheResponse: (входит в оператор if shaft )
  • connection: didFinishLoading: (также вводится оператор if shaft )

закончено - выключается и анализирует данные.

для второго dataSetToParse - @ "vent" это то, что происходит.

  • setRequestString
  • подключение: didReciveResponse:
  • подключение: didReceiveData:
  • connection: willCacheResponse: (входит в оператор if shaft )
  • connection: didFinishLoading: (также вводится оператор if shaft )

делегаты синтаксического анализатора вызываются так, как это происходит в первом случае, но затем делегаты соединения запускаются снова, но немного по-другому, потому что теперь кэш установлен.

  • setRequestString
  • подключение: didReciveResponse:
  • подключение: didReceiveData:
  • connection: didFinishLoading: (также вводится оператор if shaft )

и так далее и тому подобное .. постоянно повторяется .. Один вопрос, могу ли я использовать эти делегаты соединения, как я, настраивая два разных кэша?

...