Die NSXMLParser-Degelate-Methode 'parseErrorOccurred:' wird unter iOS 7 nie aufgerufen

Ich habe mir mehr als zwei Tage lang die Haare ausgerissen, um dieses Problem zu beheben, und ich habe mich so sehr geweigert, hier keine Frage zu stellen, da dies möglicherweise das Problem eines anderen war, sondern alle verwandten Fragen zu Stackoverflow wie googeln und zu lesendiese, oderdiese Wenn ich mehr Tutorials lese und verschiedene Beispielcodes teste, war ich immer noch nicht in der Lage, dies herauszufinden.

Ich hatte eine RSS-Parser-App, die seit dem Erscheinen vor zwei Jahren ziemlich gut funktioniert. Es ist ganz einfachNSXMLParser Implementierung und ich habe es seitdem in vielen Anwendungen verwendet und bei Bedarf kleinere Änderungen vorgenommen. Jetzt implementiere ich den gleichen Code in einem anderen Projekt und es funktioniert immer noch einwandfrei, aber wenn ich das WLAN ausschalte oder eine ungültige URL zum Parsen verwende, wird kein Fehler ausgelöstiPhone Simulator oderiPhone 5, iOS 7.0.3, während der gleiche Code gut funktioniertiPhone 4S, iOS 6.1.3

Hier ist mein Code:

NIKFeedParser.h:

#import <Foundation/Foundation.h>
#import "NIKFeedEntry.h"

@class NIKFeedEntry;
@protocol NIKFeedParserDelegate;


@interface NIKFeedParser : NSObject <NSXMLParserDelegate>
{
    NIKFeedEntry *currentItem;
    NSMutableString *currentItemValue;
NSMutableArray *feedItems;
id<NIKFeedParserDelegate> delegate;
NSOperationQueue *retrieverQueue;
NSUInteger parsingFeedsWithNumbers;
NSOperationQueue *queue;
}

@property (strong, nonatomic) NIKFeedEntry *currentItem;
@property (strong, nonatomic) NSMutableString *currentItemValue;
@property (readonly) NSMutableArray *feedItems;
@property (strong, nonatomic) id<NIKFeedParserDelegate> delegate;
@property (strong, nonatomic) NSOperationQueue *retrieverQueue;
@property (nonatomic) NSUInteger parsingFeedsWithNumbers;
@property (strong, nonatomic) NSOperationQueue *queue;

@property (nonatomic) NSString *selectedCategory;


- (void) startProcess;

@end

@protocol NIKFeedParserDelegate <NSObject>

- (void) processCompleted;
- (void) processHasErrors;

@end

und dasNIKFeedParser.m:

#import "NIKFeedParser.h"

@implementation NIKFeedParser

@synthesize currentItem;
@synthesize currentItemValue;
@synthesize feedItems;
@synthesize delegate;
@synthesize retrieverQueue;
@synthesize parsingFeedsWithNumbers;
@synthesize queue;
@synthesize selectedCategory;
- (id) init
{
    if (![super init])
    {
        return nil;
    }
    feedItems = [[NSMutableArray alloc] init];
    queue = [NSOperationQueue new];
    return self;
}

- (NSOperationQueue *)retrieverQueue
{
    if (nil == retrieverQueue)
    {
        retrieverQueue = [[NSOperationQueue alloc] init];
        retrieverQueue.maxConcurrentOperationCount = 1;
    }

    return retrieverQueue;
}

- (void) startProcess
{
    SEL method = @selector (fetchAndParseFeed);
    [[self feedItems] removeAllObjects];
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:method object:nil];

    [self.retrieverQueue addOperation:op];
}

- (BOOL)fetchAndParseFeed
{
    parsingFeedsWithNumbers = 0;
    @autoreleasepool {
        //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

        //To suppress the leak in NSXMLParser.
        [[NSURLCache sharedURLCache] setMemoryCapacity:0];
        [[NSURLCache sharedURLCache] setDiskCapacity:0];
        NSString *file = [[NSBundle  mainBundle] pathForResource:@"Feed" ofType:@"plist"];
        NSDictionary *item = [[NSDictionary alloc]initWithContentsOfFile:file];
        NSArray *array = [item objectForKey:@"Root"];
        NSURL *url = [NSURL URLWithString:
                      [[array objectAtIndex:[selectedCategory intValue]]objectForKey:@"URL"]];
        BOOL success = NO;
        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
        [parser setDelegate:self];
        [parser setShouldProcessNamespaces:YES];
        [parser setShouldReportNamespacePrefixes:YES];
        [parser setShouldResolveExternalEntities:NO];
        success = [parser parse];

        return success;
    }
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    if(nil != qualifiedName)
    {
        elementName = qualifiedName;
    }

    //NSLog(@"elementName: %@", elementName);

    if ([elementName isEqualToString:@"item"])
    {
        self.currentItem = [[NIKFeedEntry alloc] init];
        parsingFeedsWithNumbers++;
    }

    else if([elementName isEqualToString:@"title"] ||
            [elementName isEqualToString:@"description"] ||
            [elementName isEqualToString:@"link"] ||
            [elementName isEqualToString:@"guid"] ||
            [elementName isEqualToString:@"author"]||
            [elementName isEqualToString:@"pubDate"])
    {
        self.currentItemValue = [NSMutableString string];
    }

    else
    {
        self.currentItemValue = nil;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if(nil != self.currentItemValue){
        [self.currentItemValue appendString:string];
    }
}



- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if(nil != qName)
    {
        elementName = qName;
    }
    if([elementName isEqualToString:@"title"])
    {

        self.currentItem.podcastTitle = self.currentItemValue;
//        int titleLength = [self.currentItem.title length];
//        int len = (titleLength > 70) ? 70: titleLength;
//        self.currentItem.shortTitle = [self.currentItem.title substringWithRange:NSMakeRange(0, len)];


    }

    else if([elementName isEqualToString:@"link"])
    {
        self.currentItem.podcastURL = self.currentItemValue;
    }
    else if([elementName isEqualToString:@"guid"])
    {
//      self.currentItem.guidUrl = self.currentItemValue;
    }
    else if ([elementName isEqualToString:@"author"])
    {
//        self.currentItem.author = self.currentItemValue;
    }
    else if([elementName isEqualToString:@"pubDate"])
    {
//      self.currentItem.podcastDate = self.currentItemValue;
//        self.currentItem.pubDate = [FarsiNumbers convertNumbersToFarsi:self.currentItemValue];
    }
    else if([elementName isEqualToString:@"item"])
    {
        [[self feedItems] addObject:self.currentItem];
    }
}

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{
    //CDATAblock implementation
}


- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
    NSLog(@"parseErrorOccurred");

    if(parseError.code != NSXMLParserDelegateAbortedParseError) {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        [(id)[self delegate] performSelectorOnMainThread:@selector(processHasErrors)
                                              withObject:nil
                                           waitUntilDone:NO];
    }
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"parserDidEndDocument");
    //TitleViewController *viewController = [[TitleViewController alloc] init];
    //viewController.parseFinished = @"1";
//    parseFinished = [[NSString  alloc] initWithFormat:@"%d", 1];

    // NSLog(@"rss parser parser finished, %@", viewController.parseFinished);
    parsingFeedsWithNumbers = 0;
    [(id)[self delegate] performSelectorOnMainThread:@selector(processCompleted)
                                          withObject:nil
                                       waitUntilDone:NO];

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}


@end

und meinNIKMasterViewController.m:

- (void)viewDidLoad
{
    feedParser = [[NIKFeedParser alloc] init];
    [[self feedParser] setSelectedCategory:[self selectedCategory]];
    [[self feedParser] setDelegate:self];
    [[self feedParser] startProcess];
}

- (void)processCompleted
{
    [[self tableView] reloadData];
    [activityIndicator stopAnimating];
    NSInteger rowCount = [[[self feedParser] feedItems] count];

    if (rowCount!=0) {
        //

        self.tableView.delegate = self;
        self.tableView.dataSource = self;
    }
    else if ((rowCount==0) &&([UIApplication sharedApplication].networkActivityIndicatorVisible == NO ) ){
        UILabel *noContentWarning = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 480, 480)];
        noContentWarning.text = NO_CONTENT_WARNING_MESSAGE;
        noContentWarning.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/3);
    }

}


- (void)processHasErrors
{
    //Due to internet connection or server error.
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NO_CONNECTION_ALERT_TITLE message: NO_CONNECTION_ALERT_MESSAGE delegate:self cancelButtonTitle:NO_CONNECTION_ALERT_VIEW_DISMISS_BUTTON otherButtonTitles:nil];
    [alert show];
    [activityIndicator stopAnimating];
}

Setzen Sie Haltepunkte für die Hauptmethoden und verfolgen Sie den Code. In dieser Reihenfolge werden die Methoden aufgerufen:

NIKFeedParser - initNIKMasterViewController - viewDidLoadNIKFeedParser - startProcessNIKFeedParser - retrieveQueueNIKFeedParser - startProcess - [self.retrieverQueue addOperation:op];NIKMasterViewController - viewDidLoad

und dann habe ich den bank table view controller und offensichtlich KEINE sichtbare netzwerkanzeige, da das wifi ausgeschaltet ist, während es vorher in der lage war eine anzuzeigenUIAlertView Mir mitteilen, dass ein Verbindungsfehler auftritt. Was hat Apple im neuen iOS oder SDK geändert? Oder was fehle ich?

Antworten auf die Frage(0)

Ihre Antwort auf die Frage