0

根据此处找到的建议,我编写了以下代码:

__weak __block NSMutableArray *articlesArray = nil; // I'm using ARC
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.xente.mundo-r.com/turkish/json/lakari.json"]];

    NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET"
                                                            path:@"http://www.xente.mundo-r.com/turkish/json/lakari.json"
                                                      parameters:nil];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        // Print the response body in text

        NSData *data = [NSData dataWithData:responseObject];
        NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSMutableArray *articles = [[NSMutableArray alloc]initWithCapacity:jsonArray.count];

        for (NSDictionary *articleDictionary in jsonArray) {
            LOArticulo *articulo = [[LOArticulo alloc]init];
            articulo.ID = articleDictionary[@"id"];
            articulo.marca = articleDictionary[@"marca"];
            articulo.modelo = articleDictionary[@"modelo"];
            articulo.price = articleDictionary[@"precio"];
            articulo.categoria = articleDictionary[@"categoria"];
            articulo.photoURL = articleDictionary[@"photoUrl"];
            [articles addObject:articulo];
        }

        articlesArray = articles; 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    [operation start];

    return articlesArray;

问题是该方法返回null。

请你帮助我好吗?谢谢你。

新代码,至少app不会崩溃。

#import <Foundation/Foundation.h>

@interface LOArticulos : NSObject

@property (strong,nonatomic)NSArray *todosLosArticulos;

+ (LOArticulos *)sharedInstance;

-(void)loadArticlesFromJSON;

@end

实施:

#import "LOArticulos.h"
#import "LOArticulo.h"
#import "AFNetworking.h"

@interface LOArticulos (){
    NSArray *articlesArray;
}
@property (nonatomic,strong) NSArray *articlesArray;

@end

@implementation LOArticulos
@synthesize articlesArray;

+(LOArticulos *)sharedInstance{
    static LOArticulos *_sharedArticles;

    static dispatch_once_t once;
    dispatch_once(&once, ^{
        _sharedArticles = [[LOArticulos alloc]init];
    });
    return _sharedArticles;
}
-(id)init{


    if (self = [super init]) {
        [self loadArticlesFromJSON];
        self.todosLosArticulos = articlesArray;

    }
    return self;
}

- (void)getJson:(id)jsonObject{
    self.articlesArray = [NSArray new];

    NSData *data = [NSData dataWithData:jsonObject];
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSMutableArray *articles = [[NSMutableArray alloc]initWithCapacity:jsonArray.count];
    for (NSDictionary *articleDictionary in jsonArray) {
        LOArticulo *articulo = [[LOArticulo alloc]init];
        articulo.ID = articleDictionary[@"id"];
        articulo.marca = articleDictionary[@"marca"];
        articulo.modelo = articleDictionary[@"modelo"];
        articulo.price = articleDictionary[@"precio"];
        articulo.categoria = articleDictionary[@"categoria"];
        articulo.photoURL = articleDictionary[@"photoUrl"];
        [articles addObject:articulo];
    }
    self.articlesArray = [articles copy];
}

-(void)loadArticlesFromJSON{

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.xente.mundo-r.com/turkish/json/lakari.json"]];

    NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET"
                                                            path:@"http://www.xente.mundo-r.com/turkish/json/lakari.json"
                                                      parameters:nil];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        [self getJson:responseObject];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    [operation start];
}

@end
4

2 回答 2

4

您的代码实际上有两个问题会导致articlesArray 为零。

  1. 返回articlesArray 时,异步操作很可能未完成。这已经说明了。
  2. 您已将articlesArray 声明为弱指针。从概念上讲,这意味着“只有在其他人强烈提及时才将其保留在内存中”。完成块结束后,文章将超出范围,因此articlesArray 将设置为 nil。
于 2013-09-20T18:50:34.537 回答
1

为了扩展 H2C03 所说的内容,我认为正在发生的是您的方法在异步操作完成之前返回,因此articlesArray 的值仍然为 nil。

于 2013-09-20T18:41:21.280 回答