Ios 异步调用后返回可变字典
我是iOS编程新手,我正在尝试构建一个与另一台服务器通信的小应用程序,以检索XML并解析它。现在,我已经在同一个视图控制器中实现了NSXML解析器委托,我想编写一个单独的类来接受XML路径,解析它并返回有意义的数据 所以在视图控制器中我有这个Ios 异步调用后返回可变字典,ios,Ios,我是iOS编程新手,我正在尝试构建一个与另一台服务器通信的小应用程序,以检索XML并解析它。现在,我已经在同一个视图控制器中实现了NSXML解析器委托,我想编写一个单独的类来接受XML路径,解析它并返回有意义的数据 所以在视图控制器中我有这个 // On Foo Button Click XMLParser* xmlParser = [[XMLParser alloc] init]; // XMLParser would be my class file which has a method t
// 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?让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
}
下面是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];
}
}
通常,这里的想法是向异步进程发送一个回调方法,当它完成时,它会调用该方法来更新UI或执行另一个任务,或者您应该了解的关于协议的内容
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];