Objective c 创建一个简单的实用程序类
我想创建一个类来加速诸如获取应用程序委托、解析xml之类的事情 将实用程序实现为类函数似乎是有意义的。毕竟,它实际上只是一个我们可以全局调用的函数 但当我这么做的时候Objective c 创建一个简单的实用程序类,objective-c,nsxmlparser,Objective C,Nsxmlparser,我想创建一个类来加速诸如获取应用程序委托、解析xml之类的事情 将实用程序实现为类函数似乎是有意义的。毕竟,它实际上只是一个我们可以全局调用的函数 但当我这么做的时候 [xmlParser setDelegate:self]; 我有麻烦了。在类函数中,self引用类 如果你是一个objective-c程序员,那么这个问题的优雅解决方案是什么 如果我将(void)parsexmlfileatrol:(NSString*)URL转换为一个实例变量,那么事情看起来就不对了。BNUtilitiesQu
[xmlParser setDelegate:self];
我有麻烦了。在类函数中,self引用类
如果你是一个objective-c程序员,那么这个问题的优雅解决方案是什么
如果我将(void)parsexmlfileatrol:(NSString*)URL
转换为一个实例变量,那么事情看起来就不对了。BNUtilitiesQuick甚至没有一个字段,我真的希望有一些可以在任何地方访问的东西
如果我将BNUtilitiesQuick作为NSObject的类别,这看起来很尴尬。为什么我程序中的所有类都可以是XMLParser的委托
那我该怎么办
@implementation BNUtilitiesQuick
+ (BadgerNewAppDelegate *)appDelegate
{
return [[UIApplication sharedApplication] delegate];
}
+ (NSManagedObjectContext*)managedObjectContext;{
return [[BNUtilitiesQuick appDelegate] managedObjectContext];
}
+ (void)parseXMLFileAtURL:(NSString *)URL {
//you must then convert the path to a proper NSURL or it won't work
NSURL *xmlURL = [NSURL URLWithString:URL];
// here, for some reason you have to use NSClassFromString when trying to alloc NSXMLParser, otherwise you will get an object not found error
// this may be necessary only for the toolchain
NSXMLParser* xmlParser = [[[NSXMLParser alloc] initWithContentsOfURL:xmlURL] autorelease];
// Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
[xmlParser setDelegate:self];
// Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.
[xmlParser setShouldProcessNamespaces:NO];
[xmlParser setShouldReportNamespacePrefixes:NO];
[xmlParser setShouldResolveExternalEntities:NO];
[xmlParser parse];
}
@end
使用
bUtilitiesQuick
有几种方法可以解决您的问题
出现问题的主要原因是NSXMLParser使用回调机制。这样做的目的是,您不必一次将整个文档读入内存——它会在运行时进行解析。这意味着您需要为创建的每个NSXMLParser使用一个唯一的委托对象
解决方案#1-使用单例模式
bUtilitiesQuick
可以是一个,但是如果从两个不同的线程调用它两次,就会遇到问题(该类将从同时解析的两个XML文档中获取消息)。如果线程不是一个问题,这将是可行的
解决方案#2-切换XML解析器(避免问题)
另一个解决方案是使用不同的XML解析器,它不需要基于委托的解析方法。NSXMLParser是基于SAX的,通常使用回调或委托模式。Ray Wenderlich对iOS上可用的不同XML解析器以及如何选择您最喜欢的解析器有很好的了解
解决方案#3-在方法中创建委托对象
添加另一层抽象——您的parse XML方法应该创建一个新的XML Parser委托类的新实例,该类将处理此特定解析操作的回调。然后,在创建解析器时,将委托设置为这个新创建的对象,并解析XML
Utils类中没有存储状态,因此不必担心多线程问题
在您的解析方法中,返回解析后的对象而不是
(void)
,这可能会有所帮助——这似乎是您设计中的另一个陷阱 使用bUtilitiesQuick
有几种方法可以解决您的问题
出现问题的主要原因是NSXMLParser使用回调机制。这样做的目的是,您不必一次将整个文档读入内存——它会在运行时进行解析。这意味着您需要为创建的每个NSXMLParser使用一个唯一的委托对象
解决方案#1-使用单例模式
bUtilitiesQuick
可以是一个,但是如果从两个不同的线程调用它两次,就会遇到问题(该类将从同时解析的两个XML文档中获取消息)。如果线程不是一个问题,这将是可行的
解决方案#2-切换XML解析器(避免问题)
另一个解决方案是使用不同的XML解析器,它不需要基于委托的解析方法。NSXMLParser是基于SAX的,通常使用回调或委托模式。Ray Wenderlich对iOS上可用的不同XML解析器以及如何选择您最喜欢的解析器有很好的了解
解决方案#3-在方法中创建委托对象
添加另一层抽象——您的parse XML方法应该创建一个新的XML Parser委托类的新实例,该类将处理此特定解析操作的回调。然后,在创建解析器时,将委托设置为这个新创建的对象,并解析XML
Utils类中没有存储状态,因此不必担心多线程问题
在您的解析方法中,返回解析后的对象而不是
(void)
,这可能会有所帮助——这似乎是您设计中的另一个陷阱 这有什么问题?您只需将委托实现为类方法而不是实例方法。这有什么错?您只需将委托实现为类方法,而不是实例方法。我喜欢第三种解决方案。因此,BNUtilitiesQuick将有两个版本,一个是实例版本,另一个是类版本。非常好。解析函数将数据写入coredata。我喜欢第三种解决方案。因此,BNUtilitiesQuick将有两个版本,一个是实例版本,另一个是类版本。很好。解析函数将数据写入coredata。