2013-10-08 19 views
0

對於iOS編程而言,我試圖構建一個與另一臺服務器進行通信以檢索XML並解析它的小型應用程序。現在我已經在同一個View Controller中實現了NSXML解析器委託,我想編寫一個單獨的類來接受XML路徑,解析它並返回有意義的數據。異步調用後返回可變字典

所以在視圖控制器我有這個

// On Foo Button Click 
XMLParser* xmlParser = [[XMLParser alloc] init]; 
// XMLParser would be my class file which has a method to parse XML 
xmlParser.readXMLFromPath(pathToXML); 

在XMLParser的類文件:

- (NSMutableDictionary*) readXMLFromPath: (NSString* pathToXML) { 
    NSMutableDictionary* resultSet; 
    // Alloc NSXMLParser and implement its delegate methods 
    // resultSet would now hold the needed Data 
} 

所以現在我應該怎麼回回resultSet回的viewController?

+0

通常這裏的想法是對的方法發送呼叫回到你異步的過程,當它完成它調用更新UI或執行其他任務,或任何 –

+0

你應該瞭解原COLS – JuJoDi

回答

0

當結果準備好而不是立即返回時,是否讓XML解析器的客戶端在塊中傳遞。你也可以讓客戶端通過一個單獨的errorBlock,以及出錯的時候。

- (void)readXMLFromPathWithSuccessBlock:(void (^)(NSMutableDictionary *results))successBlock; 
{ 
    // Alloc NSXMLParser and implement its delegate methods 
    // Save successBlock in a property 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    // Call success block and pass results to the client 
} 
0

這裏的NSOperation的子類,我用來做一個NSOperationQueue我所有的XML解析:

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

@class ParseXMLOperation; 

@protocol ParseXMLCallbackDelegate <NSObject> 

-(void)parseOperationComplete:(ParseXMLOperation *)completedOperation; 

@end 

@interface ParseXMLOperation : NSOperation 
{ 
    GDBaseParser *xmlParserDelegate; 
    NSData *dataToParse; 
    id <ParseXMLCallbackDelegate> callbackDelegate; 
} 

@property(nonatomic,strong)GDBaseParser *xmlParserDelegate; 
@property(nonatomic,strong)NSData *dataToParse; 
@property(nonatomic,strong)id <ParseXMLCallbackDelegate> callbackDelegate; 
-(id)initWithParser:(GDBaseParser *)inParserDelegate; 
@end 


@implementation ParseXMLOperation 

@synthesize xmlParserDelegate, dataToParse, callbackDelegate; 

-(id)initWithParser:(GDBaseParser *)inParserDelegate 
{ 
    self = [super init]; 
    if(self != nil) 
    { 
     self.xmlParserDelegate = inParserDelegate; 
    } 
    return self; 
} 

-(void)main 
{ 
    @autoreleasepool 
    { 

     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dataToParse]; 
     xmlParserDelegate.currentContext = localContext; 
     [parser setDelegate:xmlParserDelegate]; 
     [parser setShouldProcessNamespaces:NO]; 
     [parser setShouldReportNamespacePrefixes:NO]; 
     [parser setShouldResolveExternalEntities:NO]; 
     [parser parse]; 
     [self performSelectorOnMainThread:@selector(sendOperationComplete) withObject:nil waitUntilDone:NO]; 

    } 


} 


-(void)sendOperationComplete 
{ 
    if(callbackDelegate != nil && [callbackDelegate  respondsToSelector:@selector(parseOperationComplete:)]) 
    { 
     [callbackDelegate parseOperationComplete:self]; 
    } 
} 

我然後可以設置操作,並通過這樣做,將它添加到隊列中:

  MyParser *parserDelegate = [[MyParser alloc] init]; 
ParseXMLOperation *parseOperation = [[ParseXMLOperation alloc] initWithParser:parserDelegate]; 
     parseOperation.dataToParse = parseData; 
     parseOperation.completionBlock = ^{ 
      localOperation.messageHeaderDict = parserDelegate.messageHeaders; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       //notify your UI that you are done with your parsing 
      }); 

     }; 
     [self.xmlParsingQueue addOperation:parseOperation];