当我在下面记录我的数组 self.userData 时,数组被填充。
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableDictionary *viewParams = [NSMutableDictionary new];
[viewParams setValue:@"u000" forKey:@"view_name"];
[DIOSView viewGet:viewParams success:^(AFHTTPRequestOperation *operation, id responseObject) {
self.userData = [responseObject mutableCopy];
NSLog(@"userData = %@", self.userData);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure: %@", [error localizedDescription]);
}];
但是,当我尝试获取填充数据并在这些括号之外(例如下面)使用它时,数组是空的?我该如何解决这个问题?
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableDictionary *viewParams = [NSMutableDictionary new];
[viewParams setValue:@"u000" forKey:@"view_name"];
[DIOSView viewGet:viewParams success:^(AFHTTPRequestOperation *operation, id responseObject) {
self.userData = [responseObject mutableCopy];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure: %@", [error localizedDescription]);
}];
self.userBio.text = self.userData[0][@"userbio"];
NSLog(@"userData = %@", self.userData);
最佳答案
您误解了 AFHTTPRequestOperation 等异步方法的工作原理。重点是这种方法会在请求发送到远程服务器之前立即返回。
任务完成后,它会调用您的完成 block 。一旦数据可用,您想做的任何工作都应该在您的完成 block 中。
我不记得 AFNetworking 的完成方法是在主线程上运行还是在后台线程上运行。查阅他们的文档。如果完成 block 是从后台运行的,那么您需要将 UI 更改放在对 dispatch_async(dispatch_get_main_queue()) 的调用中。
编辑:
看看文档,您使用的 AFHTTPRequestOperation
类似乎默认调用主队列上的完成 block ,除非您通过设置 successCallbackQueue 指定不同的队列
属性。
因此,除非您设置了 successCallbackQueue
,否则您无需担心在对 dispatch_async() 的调用中包含 UI 操作。
关于ios - 数组已填充,但括号外为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33335070/