2

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

我想过使用单例,但在多线程环境中有点担心。任何建议将不胜感激。谢谢!

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

4

2 回答 2

2

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

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

于 2012-07-06T17:37:00.770 回答
1

ARC并不重要。只要您了解单例的消极方面并准备好接受或处理它,该模式就可以正常工作。

我建议的替代方法是设计一个静态类并使用提供者模式。这是我与 RESTKit 一起使用的典型接口(这个接口访问 facebook graph 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 更新会自动发生。

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

于 2012-07-09T07:53:41.323 回答