访问单例时视图冻结几秒钟 class
View freezes for few seconds while accessing singleton class
这是我正在使用的方法
+(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 但它不是静态分配,在我的主屏幕中我可以访问所有数据并存储在我的单例中 class。
但是当我尝试从一个视图控制器转到主屏幕时,它会挂起几秒钟如何克服这个问题?
调用单例方法:
-(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.
}
存储后我正在调用单例 class 在视图中加载方法
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];
最后我只用了 dispatch_async(dispatch_get_main_queue(),^{})
if([file.dicCategoryDetails count]!=0&&[file.dicProductDetails count]!=0)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self datahandlers];
});
}
如果创建 internalInstance 需要可测量的时间,那么您的主线程 将 在需要时停止,除非您更改代码以便不需要 internalInstance。启动应用程序时首先从后台线程调用 getDataHandler 可能会有所帮助,但在创建 internalInstance 之前不会 return 调用 getDataHandler。
"call getDataHandler from a background thread":
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[SomeClass getDataHandler];
});
在 application:didFinishLaunching 内:甚至更早。
这是我正在使用的方法
+(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 但它不是静态分配,在我的主屏幕中我可以访问所有数据并存储在我的单例中 class。
但是当我尝试从一个视图控制器转到主屏幕时,它会挂起几秒钟如何克服这个问题?
调用单例方法:
-(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.
}
存储后我正在调用单例 class 在视图中加载方法
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];
最后我只用了 dispatch_async(dispatch_get_main_queue(),^{})
if([file.dicCategoryDetails count]!=0&&[file.dicProductDetails count]!=0)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self datahandlers];
});
}
如果创建 internalInstance 需要可测量的时间,那么您的主线程 将 在需要时停止,除非您更改代码以便不需要 internalInstance。启动应用程序时首先从后台线程调用 getDataHandler 可能会有所帮助,但在创建 internalInstance 之前不会 return 调用 getDataHandler。
"call getDataHandler from a background thread":
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[SomeClass getDataHandler];
});
在 application:didFinishLaunching 内:甚至更早。