所以我有这个服务类利用Restkit来使用REST Web服务。它经常在我的应用程序中使用。我不是在每次使用它之前初始化它,而是创建这个类的对象并在appDelegate中初始化它。但这是最好的方法吗?
我考虑过使用单例,但在多线程环境中有点担心它。任何建议将非常感谢。谢谢!
编辑:我应该提到我在ARC环境中工作。答案 0 :(得分:2)
即使在多线程或ARC环境中,单例模式也没有任何问题,只要对象数据是只读或受保护的。当我写这样的类时,我使用单例并使用GCD来保护对它使用的极少数可变数据结构的访问(比如它完成的当前请求列表以及完成时要执行的完成块)。
如果您支持iOS 5+或Mac OS X 10.7+,新的私有并发队列和障碍会使这一点更加高效。我不知道RestKits多线程,所以你可能需要检查,但我还是推荐一个单例。
答案 1 :(得分:1)
我建议作为替代方案是设计静态类并使用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处理。