首先,请原谅我的英语不好,但我是法国人,我会尽力让自己理解。
所以,我用这种结构编写了一个简单的应用程序: - viewController类(处理UI) - 产品类(定义对象产品) - ws_product类(包含一些获取json数据的函数)
我尝试做的是返回我在viewController中解析ws_product中的json之后得到的products数组。多亏了这个,我可以填充我的tableView,我的应用程序将不再是空的!
我的实际ws_product是:
#import "WS_Produit.h"
#import "Produit.h"
#import "ViewController.h"
@implementation WS_Produit
- (NSMutableArray *)getProduitsJSON
{
__block NSMutableArray *result;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() {
NSLog(@"on passe en async");
NSError *error = nil;
NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"the url to load"]];
NSDictionary *produits = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
if( error )
{
NSLog(@"%@", [error localizedDescription]);
}
else {
dispatch_sync(dispatch_get_main_queue(), ^(){
NSLog(@"retour en sync");
result = [[NSMutableArray alloc] init];
Produit *tmp;
NSArray *produit = produits[@"produits"];
for ( NSDictionary *property in produit )
{
tmp = [Produit new];
tmp.ref = property[@"ref"];
tmp.name = property[@"name"];
tmp.description = property[@"description"];
tmp.price = property[@"price"];
tmp.imgURL = property[@"imgURL"];
[result addObject:tmp];
NSLog(@"%@", result);
}
});
}
});
NSLog(@"sortie du block");
NSLog(@"%@", result);
return result;
}
@end
我的问题是当我离开dispatch_queue时,我的结果数组是空的,所以在我的viewController类中返回它是没用的,我该怎么办?
答案 0 :(得分:2)
因为您正在使用dispatch_async,所以您的结果数组在填充之前将返回为空。
块正是您所需要的。它们可以用作异步方法的回调。
在viewController中,您应该将块传递给方法
[myObject getProduitsJSON:
success:^(NSArray *results){
// Use your results here
// Reload table for example.
}
failure:^(NSError *error){
// Use your error message (show it for example)
}];
所以你的方法应该是这样的:
-(void)getProduitsJson:(void(^)(NSArray* results))success failure:(void(^)(NSError* error))failure {
{
NSMutableArray *result = [[NSMutableArray alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() {
NSError *error = nil;
NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"the url to load"]];
NSDictionary *produits = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
if(error) {
failure(error);
}else{
// Fill your array
success(result);
}
}
}