在访问singleton类时,查看冻结几秒钟

时间:2015-09-11 13:15:15

标签: ios objective-c singleton grand-central-dispatch dispatch-async

这是我正在使用的方法

 +(dataHandler *)getDataHandler
    {

        dispatch_once(&internalOnceToken,^{
            internalInstance = [[dataHandler alloc] init];
            if(internalInstance) {
                NSLog(@"Internal instance created: %@", internalInstance);
            }
        });
        if(internalOnceToken == -1)
        {
            NSLog(@"Internal instance exists: %@", internalInstance);
        }
        return internalInstance;

    }

我尝试使用dispatch_asyn,但它不是静态分配,在我的主屏幕中,我可以访问所有数据并存储在我的单例类中。

但是当我尝试从一个视图控制器转到主屏幕时,它会挂起几秒钟如何克服这个问题?

调用Singleton方法:

 -(void)responseFunction:(NSMutableDictionary *)response
    {
            BOOL sucess;
            sucess =[[response objectForKey:@"sucess"]boolValue];
            NSLog(@"response Method%@",response);
            NSString *subimages;

            if(!sucess)
            {
                //storing response data to singleton class.
             }
         [self datahandlers];//here i am calling singleton.
    }

存储后我在视图中调用singleton类做了加载方法

if([file.dicCategoryDetails count]!=0&&[file.dicProductDetails count]!=0)
    {
        [self datahandlers];
    }

这是数据处理程序方法

-(void)datahandlers
{
    for(NSDictionary *diccategory in file.categoryArr)
    {
        NSMutableDictionary *dicparsing=[[NSMutableDictionary alloc]init];
        [dicparsing setObject:[diccategory objectForKey:@"category"] forKey:@"category"];
        [dicparsing setObject:[diccategory objectForKey:@"name"] forKey:@"name"];
        [dicparsing setObject:[diccategory objectForKey:@"image"] forKey:@"image"];
        [dicparsing setObject:[diccategory objectForKey:@"subcategory"] forKey:@"subcategory"];
        [ArrName addObject:dicparsing];

    }
    NSLog(@"inside data handler%@",ArrName);
    [collectionview reloadData];
    [self scrollView];

}

在视图中加载了

 file= [dataHandler getDataHandler];

2 个答案:

答案 0 :(得分:1)

最后我只使用 dispatch_async(dispatch_get_main_queue(),^ {})

 if([file.dicCategoryDetails count]!=0&&[file.dicProductDetails count]!=0)
    {
        dispatch_async(dispatch_get_main_queue(), ^{

                   [self datahandlers];
                });

    }

答案 1 :(得分:0)

如果创建internalInstance需要可测量的时间,那么主线程在需要时停止,除非您更改代码以便不需要internalInstance。当你启动应用程序时,它可以帮助从后台线程调用getDataHandler作为第一件事,但是在创建internalInstance之前不会调用getDataHandler。

“从后台线程调用getDataHandler”:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [SomeClass getDataHandler];
});

内部应用程序:didFinishLaunching:甚至更早。