处理多线程ios 6应用程序中的对象相互依赖性

时间:2013-02-15 03:34:26

标签: objective-c multithreading ios6 dependencies nsoperationqueue

我有一个ios 6应用程序,在App Delegate中实例化3个单身,如下所示:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
     Constants *constSingleton = [Constants getSingleton];
     EntryContainerSingleton * eSingle = [EntryContainerSingleton getSingleton];   
     LocationMgrSingleton *loc = [LocationMgrSingleton getSingleton];
     return YES; 
 }

然而,问题是所有三个调用同时在不同的线程中执行。 EntryContainerSingleton依赖Constants来完成一些任务。但是Constants在执行这些任务时并没有完全实例化。

我该如何处理这种情况? 我在谷歌上搜索,在以前版本的iOS中,人们使用NSOperation队列来做到这一点。

然而,我不确定这是否是iOS 6中的一个好方法。即使它是我之前没有使用NSOperation队列,并且Web上的所有示例都来自以前的版本并且在某些类中实例化,这是不是APP代表。

如果有人可以给我一些关于如何在App Delegate中执行此操作的示例代码,以便让我开始我非常感谢

修改


条目控制器单例

 -(id)init
 {
    self = [super init];
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);

    [self getEntriesFromServer];
      ..............
      .............   
    constSingleton = [Constants getSingleton];
    [self addSelfAsObserverToNotifications];
    return self;
  }

inside entriescontrollersingleton

 -(void)getEntriesFromServer
 {
     NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);
     if(!constSingleton)
     {
        NSLog(@"constSingleton is null");
     }
     __block NSString *dateString1 = [constSingleton getCurrentDateTime];
     NSLog(@"Sending notification: Async Call started successfully at time %@", dateString1);
     [[NSNotificationCenter defaultCenter] postNotificationName:@"didStartAsyncProcess"
                                                    object:self];


  .......

}


控制台输出

 [96894:c07] -[AppDelegate application:didFinishLaunchingWithOptions:] 21
 [96894:c07] +[Constants getSingleton] 39
 [96894:c07] -[Constants init] 65
 [96894:c07] -[EntryContainerSingleton init] 75
 [96894:c07] -[EntryContainerSingleton getEntriesFromServer] 154
 [96894:c07] constSingleton is null
 [96894:c07] Sending notification: Async Call started successfully at time (null)
 [96894:c07] -[Constants incrementNumBackgroundNetworkTasksBy1:] 87

1 个答案:

答案 0 :(得分:0)

如果Entries单例需要访问Constants单例,它应该调用[Constants getSingleton]来获取它。确保正确实现单例方法(请参阅Objective-C Singleton implementation, am i doing it right?

每次需要访问单个对象时,都应该调用[ClassName getSingleton]。应该没有任何理由将单例存储为应用程序委托中的实例变量。