Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 创建一个简单的实用程序类_Objective C_Nsxmlparser - Fatal编程技术网

Objective c 创建一个简单的实用程序类

Objective c 创建一个简单的实用程序类,objective-c,nsxmlparser,Objective C,Nsxmlparser,我想创建一个类来加速诸如获取应用程序委托、解析xml之类的事情 将实用程序实现为类函数似乎是有意义的。毕竟,它实际上只是一个我们可以全局调用的函数 但当我这么做的时候 [xmlParser setDelegate:self]; 我有麻烦了。在类函数中,self引用类 如果你是一个objective-c程序员,那么这个问题的优雅解决方案是什么 如果我将(void)parsexmlfileatrol:(NSString*)URL转换为一个实例变量,那么事情看起来就不对了。BNUtilitiesQu

我想创建一个类来加速诸如获取应用程序委托、解析xml之类的事情

将实用程序实现为类函数似乎是有意义的。毕竟,它实际上只是一个我们可以全局调用的函数

但当我这么做的时候

[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。