//

Problemen met class

Problemen met class discussie in Ontwikkelen voor iOS forum; ( verdwijnt na registratie ) Hallo, Ik ben al een tijdje bezig met een app waarin gebruik wordt gemaakt van een XML Parser. Het ontwikkelen doe ik in fases, dus ...



Ga terug   iPhone, iPod touch, iPad en Apple TV forum > Development > Ontwikkelen voor iOS
Wachtwoord vergeten? Registreren!
Registreer FAQ Ledenlijst Kalender Berichten van vandaag

Discussie gesloten

 

Discussietools Weergave
  #1  
Oud 17-06-11, 17:39
DJ14 DJ14 is offline
• iOS 7.1
• 4.3.5
• Besturingssysteem: Mac OS X
 
Geregistreerd: Feb 2010
Berichten: 121
Standaard Problemen met class

Hallo,

Ik ben al een tijdje bezig met een app waarin gebruik wordt gemaakt van een XML Parser. Het ontwikkelen doe ik in fases, dus ik verbeter de app stukje bij beetje. Nu ben ik bezig om het asynchronous laden van de xml bestanden van het internet te implementeren (ipv synchronous). Hiervoor gebruik ik ASIHTTPRequest. De XMLParser zit verwerkt in een subclass van NSObject, en bevat de NSXMLParserDelegate methods. Nu in deze XML Parser class heb ik de volgende functie staan om het parsen af te handelen (verder staan er nog delegate methods in):

Code:
-(id) loadXMLByArray:(NSArray *)urlArray {
    
    NSLog(@"first call to XML Parser");
    
    if(self.arrayOfObjects){
        [arrayOfObjects removeAllObjects];
        arrayOfObjects = nil;
        [arrayOfObjects release];
    }
    
    if(!self.arrayOfObjects){
        arrayOfObjects = [[NSMutableArray alloc] init];
    }
    
    
    if(context == nil){
        context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    }
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ObjectInfo" inManagedObjectContext:context];
    
    for (NSString *urlString in urlArray){
        NSLog(@"HOI");
        NSURL *url = [[NSURL alloc] initWithString:urlString];
        
        __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        [request setCompletionBlock:^{
            
            // Use when fetching binary data
            NSData *responseData = [request responseData];
            NSXMLParser *parser = [[NSXMLParser alloc] initWithData:responseData];
            [parser setDelegate:self];
            [parser setShouldProcessNamespaces:NO]; // We don't care about namespaces
            [parser setShouldReportNamespacePrefixes:NO]; //
            [parser setShouldResolveExternalEntities:NO];
            [parser parse];
            [url release];
            [parser release];
            
            
            if([self.arrayOfObjects count] != 0){
                for(Object *object in self.arrayOfObjects){
                    ObjectInfo *objectInfo = [[ObjectInfo alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
                    objectInfo.ObjectContent = object.content;
                    objectInfo.ObjectDate = object.dateCreated;
                    objectInfo.ObjectUsername = object.userName;
                    objectInfo.ObjectSortDate = object.sortDate;
                    
                    NSURL *url = [NSURL URLWithString:object.urlToImage];
                    NSData *data = [[NSData alloc] initWithContentsOfURL:url];
                    UIImage *uiImage = [UIImage imageWithData:data];
                    [data release];
                    NSData * imageData = UIImagePNGRepresentation(uiImage);
                    objectInfo.ObjectImage = imageData;
                    MyAppDelegate *theDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
                    [theDelegate saveContext];  
                    [objectInfo release];
                }
            }
            
            [self.arrayOfObjects removeAllObjects];
            
        }];
        [request setFailedBlock:^{
            NSError *error = [request error];
            NSLog(@"Error during asynchronous request (ASIHTTPRequest): %@",error);
        }];
        [request startAsynchronous];
        
    }
    
    RootViewController *rVC = [[RootViewController alloc] init];
    [rVC finishFetch];
}
Vanuit een andere class (RootViewController) initaliseer ik deze XMLParser class en start het parsen door het volgende te doen:

Code:
NSArray *arrayWithURLs = [NSArray arrayWithObjects:@"http://somedomain.com/somefeed.xml", @"http://somedomain.com/somesecondfeed", nil];
            XMLParser *xmlParser = [[XMLParser alloc] init];
            [xmlParser loadXMLByArray:arrayWithURLs];
Echter, alles werkt niet zoals het zou moeten werken. Uit de console blijkt dat de functie "loadXMLByArray" uit de XMLParser class veel vaker wordt aangeroepen dan eenmaal. Waarom is dit? Ik roep deze methode immers slechts een keer op vanuit de RootViewController class... Verder blijkt de "arrayOfObjects" ook uit de XMLParser class telkens leeg te zijn. Deze array wordt gevuld door de NSXMLParser delegate methods in de XML Parser class. Waarom wordt deze array niet gewoon gevuld? Het lijkt wel alsof er in de completion block niet gewacht wordt tot het parsen klaar is. Weet iemand wat ik verkeerd doe? (denk zelf dat het iets met die blocks te maken heeft). Bij voorbaat dank.
Advertentie
Advertentie Gesponsorde links (verdwijnt na registratie)

  #2  
Oud 18-06-11, 19:06
DJ14 DJ14 is offline
• iOS 7.1
• 4.3.5
• Besturingssysteem: Mac OS X
 
Geregistreerd: Feb 2010
Berichten: 121
Standaard

Opgelost . Toelichting:

Aan het einde van de "loadXMLByArray" functie wordt RootViewController allocated en initialized, terwijl deze al in het geheugen stond. Verder werd de functie "loadXMLByArray" aangeroepen vanuit de viewDidLoad method in de RootViewController class. Door het opnieuw allocaten en initalizen van RootViewController wordt de viewDidLoad method opnieuw geroepen, waardoor "loadXMLByArray" ook opnieuw wordt geroepen. Dit bleef zo doorgaan en resulteert dus in een loop. De oplossing die ik heb geimplementeerd is gebruik van NSNotificationCenter om zo de functie "finishFetch" in RootViewController op te roepen.
  #3  
Oud 18-06-11, 20:39
XIII's schermafbeelding
XIII XIII is offline
iPhone(club) Guru
• iOS 16.1
• iPadOS 16.1
• Besturingssysteem: macOS
 
Geregistreerd: Jul 2009
Berichten: 10.082
Standaard

Slotje dan maar.
__________________
We are one, but we are not the same... Talk to each other!
Discussie gesloten



Er zijn 1 actieve gebruikers die momenteel deze discussie bekijken (0 leden en 1 gasten)

 

Soortgelijke discussies

Discussie Auteur Forum Reacties Laatste bericht
Variabele uit andere class halen DJ14 Ontwikkelen voor iOS 5 05-04-11 10:28
flash class 0 sms verstutren via de Iphone? manga Jailbreak apps en thema's 9 21-10-09 15:11
UILabel updaten vanuit andere class Niels2678 Ontwikkelen voor iOS 18 05-10-09 11:42
Dynamic Class Loading markvwijnen Ontwikkelen voor iOS 2 16-08-09 20:17

Regels voor berichten
Je mag geen nieuwe discussies starten
Je mag niet reageren op berichten
Je mag geen bijlagen versturen
Je mag niet je berichten bewerken

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit
Trackbacks are Aan
Pingbacks are Aan
Refbacks are Uit



Alle tijden zijn GMT +2. Het is nu 06:54.