如何在Objective-c中设计经常访问的类

时间:2012-07-06 17:19:22

标签: objective-c restkit

所以我有这个服务类利用Restkit来使用REST Web服务。它经常在我的应用程序中使用。我不是在每次使用它之前初始化它,而是创建这个类的对象并在appDelegate中初始化它。但这是最好的方法吗?

我考虑过使用单例,但在多线程环境中有点担心它。任何建议将非常感谢。谢谢!

编辑:我应该提到我在ARC环境中工作。

2 个答案:

答案 0 :(得分:2)

即使在多线程或ARC环境中,单例模式也没有任何问题,只要对象数据是只读或受保护的。当我写这样的类时,我使用单例并使用GCD来保护对它使用的极少数可变数据结构的访问(比如它完成的当前请求列表以及完成时要执行的完成块)。

如果您支持iOS 5+或Mac OS X 10.7+,新的私有并发队列和障碍会使这一点更加高效。我不知道RestKits多线程,所以你可能需要检查,但我还是推荐一个单例。

答案 1 :(得分:1)

ARC并不重要。只要您了解单身人士的the negative方面并准备好了解或处理它,这种模式就可以了。

我建议作为替代方案是设计静态类并使用Provider模式。这是我与RESTKit一起使用的典型界面(这个访问facebook图形API)。

@interface FBProvider : NSObject

+ (BOOL) canMakeRequests;
+ (id) login;
+ (id) logout;

+ (BOOL) application: (UIApplication*) application 
             openURL: (NSURL*) url 
   sourceApplication: (NSString*) sourceApplication 
          annotation: (id) annotation;

+ (id) perform: (RKRequestMethod) method friends: (Friend*) frien;
+ (id) perform: (RKRequestMethod) method boasts: (id) obj;
+ (id) perform: (RKRequestMethod) method invites: (id)obj;
+ (id) perform: (RKRequestMethod) method likes: (id)obj;

@end

没有单身,一切都是静态的,如果您设计界面以便从您的应用数据模型进行操作而不是您的Web服务UI更新会自动发生。

或者,如果您觉得必须使用单身人士,为什么不利用您的app委托,这是一个真正的单身人士。为了扩展,我建议您的Web服务或数据提供者成为现有单例的成员,您将永远不必担心自己的线程问题,因为希望这些问题由Cocoa处理。