【发布时间】:2015-08-03 17:42:51
【问题描述】:
我仍然面临 iOS 上的多线程问题。基本上我想做的是在 MainViewController 中获取 json(当应用程序启动时),然后用这些数据填充左侧菜单(SWRevealViewController)。
但是让我们考虑一下网速低的情况,当用户显示菜单并且数据不是来自 MainViewController 时。显然我正在从两个控制器中获取 JSON。我不知道如何让 Sidebar 等待该数据,直到 MainViewController 完成获取?
从 MainViewController 调用
[[CategoriesStore sharedStore] fetchDataWithCallback:^(NSArray *allCategories, NSError* error) {
}];
从异步块内的 SidebarViewController 调用
[[CategoriesStore sharedStore] fetchDataWithCallback:^(NSArray *allCategories, NSError* error) {
if (error) {
} else {
//[self.tableView beginUpdates];
blockSafe.allDirectories = allCategories;
[blockSafe.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationFade];
}
}];
从 CategoriesStore 获取 json(单例模型)
+(instancetype)sharedStore {
static CategoriesStore *sharedStore = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedStore = [[self alloc] initPrivate];
});
return sharedStore;
}
- (instancetype)initPrivate {
self = [super init];
if (self) {
[self sessionConf];
_allCategories = nil;
}
return self;
}
- (void)fetchDataWithCallback:(void(^)(NSArray *allCategories, NSError* error))callback {
NSLog(@"CategoriesStore - %@",self.description);
@synchronized(self) {
if (!_allCategories) {
NSURLSessionDataTask *getCategories =
[self.session dataTaskWithURL:categoriesURL
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
if (error) {
NSLog(@"error - %@",error.localizedDescription);
callback(nil, error);
return;
}
NSError *jsonError = nil;
NSArray *json =
[NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableContainers
error:&jsonError];
if (!jsonError) {
_allCategories = json;
NSLog(@"categories fetched");
callback(_allCategories, nil);
} else {
callback(nil, jsonError);
}
}];
[getCategories resume];
} else {
callback(_allCategories,nil);
}
}
}
感谢您的帮助和建议!
【问题讨论】:
-
有人吗?请。我敢打赌,这是一件容易而棘手的事情。另一种解决方案是回调侧边栏视图控制器,但它不适用于 SWRevealController。
标签: ios objective-c json multithreading