gpt4 book ai didi

ios - __ block : Assigning a variable inside a block to an outside variable does not work

转载 作者:行者123 更新时间:2023-11-28 18:36:03 25 4
gpt4 key购买 nike

按照找到的建议 here ,我写了下面一段代码:

__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。

你能帮帮我吗?谢谢。

新代码,至少应用不会崩溃。

#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

最佳答案

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

  1. 当您返回 articlesArray 时,异步操作很可能没有完成。这已经说过了。
  2. 您已将 articlesArray 声明为弱指针。从概念上讲,这意味着“仅当有人其他强烈引用它时才将其保留在内存中”。完成 block 结束后,文章将超出范围,因此 articlesArray 将设置为 nil。

关于ios - __ block : Assigning a variable inside a block to an outside variable does not work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18923562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com