29,028
社区成员
发帖
与我相关
我的任务
分享
#import "WordTestViewController.h"
#import <BmobSDK/Bmob.h>
@interface WordTestViewController ()
@property (strong, nonatomic) IBOutlet UIView *testView;
@property (strong, nonatomic) NSArray *dataArray;
@end
@implementation WordTestViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
// self.dataArray = [self configDataWithClas:@"N4"];
[self configDataWithClas:@"N4"];
NSLog(@"self.dataArray:%@",self.dataArray);
}
-(void)layoutUI
{
self.testView.layer.cornerRadius = 20;
self.testView.layer.masksToBounds = YES;
}
-(void)configDataWithClas:(NSString *)class
{
BmobQuery* query = [BmobQuery queryWithClassName:@"wordTest"];
[query whereKey:@"class" equalTo:class];
[query setLimit:10];
NSMutableArray *mutalArray = [NSMutableArray new];
[query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
for (BmobObject *obj in array) {
NSMutableDictionary *mutalDict = [[NSMutableDictionary alloc] init];
[mutalDict setObject:[obj objectForKey:@"word"] forKey:@"word"];
[mutalDict setObject:[obj objectForKey:@"TrueAns"] forKey:@"TrueAns"];
[mutalDict setObject:[obj objectForKey:@"fakeAns1"] forKey:@"fakeAns1"];
[mutalDict setObject:[obj objectForKey:@"fakeAns2"] forKey:@"fakeAns2"];
[mutalDict setObject:[obj objectForKey:@"fakeAns3"] forKey:@"fakeAns3"];
[mutalArray addObject:mutalDict];
}
NSLog(@"Block中的mutalArray%@",mutalArray);
}];
NSLog(@"Block外的mutalArray%@",mutalArray);
self.dataArray = mutalArray;
}
@end
***********************Log信息****************************
2019-02-27 15:39:39.857261+0800 WordBank[5327:381131] Block外的mutalArray(
)
2019-02-27 15:39:39.857752+0800 WordBank[5327:381131] self.dataArray:(
)
2019-02-27 15:39:40.009077+0800 WordBank[5327:381131] Block中的mutalArray(
{
TrueAns = "\U6905\U5b50";
fakeAns1 = "\U68b3\U5b50";
fakeAns2 = "\U4e66\U5305";
fakeAns3 = "\U684c\U5b50";
word = "\U3044\U3059";
},
{
TrueAns = "\U59b9\U59b9";
fakeAns1 = "\U5f1f\U5f1f";
fakeAns2 = "\U59d0\U59d0";
fakeAns3 = "\U54e5\U54e5";
word = "\U3044\U3082\U3046\U3068";
},
{
TrueAns = "\U5927\U6d77";
fakeAns1 = "\U866b\U5b50";
fakeAns2 = "\U5c71";
fakeAns3 = "\U9ca8\U9c7c";
word = "\U3046\U307f";
},
{
TrueAns = "\U4f46\U662f";
fakeAns1 = "\U6240\U4ee5";
fakeAns2 = "\U56e0\U4e3a";
fakeAns3 = "\U53ef\U80fd";
word = "\U3068\U3053\U308d\U304c";
},
[quote=引用 29 楼 So灬低调 的回复:]。。。。一般情况下他们说的方法都是可行了!要是还不行那就狠一点咯 while(1) { if(mutalArray.count!=0){ break; } }
[self configDataWithClas:@"N4" successBlock:^(NSArray *returnList) {
// 在这里更新UI和赋值操作
}];
你把代码贴出来,打印的顺序不对。
[self configDataWithClas:@"" successBlock:^(NSArray *returnList) {
}];
2019-02-28 10:45:51.395392+0800 WordBank[1230:201778]
self.dataArray:
(
)
2019-02-28 10:45:51.634465+0800 WordBank[1230:201778] ==============(
{
TrueAns = "\U6905\U5b50";
fakeAns1 = "\U68b3\U5b50";
fakeAns2 = "\U4e66\U5305";
fakeAns3 = "\U684c\U5b50";
word = "\U3044\U3059";
},
{
TrueAns = "\U59b9\U59b9";
fakeAns1 = "\U5f1f\U5f1f";
fakeAns2 = "\U59d0\U59d0";
fakeAns3 = "\U54e5\U54e5";
word = "\U3044\U3082\U3046\U3068";
},
{
TrueAns = "\U5927\U6d77";
fakeAns1 = "\U866b\U5b50";
fakeAns2 = "\U5c71";
fakeAns3 = "\U9ca8\U9c7c";
word = "\U3046\U307f";
},
{
TrueAns = "\U4f46\U662f";
fakeAns1 = "\U6240\U4ee5";
fakeAns2 = "\U56e0\U4e3a";
fakeAns3 = "\U53ef\U80fd";
word = "\U3068\U3053\U308d\U304c";
},
{
TrueAns = "\U5403\U996d";
fakeAns1 = "\U4f11\U606f";
fakeAns2 = "\U6563\U6b65";
fakeAns3 = "\U5435\U67b6";
word = "\U3084\U3059\U3080";
},
{
TrueAns = "\U6628\U5929";
fakeAns1 = "\U53bb\U5e74";
fakeAns2 = "\U4eca\U5e74";
fakeAns3 = "\U660e\U5929";
word = "\U304d\U306e\U3046";
},
{
TrueAns = "\U5fd8\U8bb0";
fakeAns1 = "\U6d17";
fakeAns2 = "\U5403\U996d";
fakeAns3 = "\U7761\U89c9";
word = "\U308f\U3059\U308c\U308b";
},
{
TrueAns = "\U9c7c";
fakeAns1 = "\U9a6c";
fakeAns2 = "\U9752\U86d9";
fakeAns3 = "\U91ce\U732a";
word = "\U3055\U304b\U306a";
},
{
TrueAns = "\U65b0\U7684";
fakeAns1 = "\U53ef\U7231\U7684";
fakeAns2 = "\U8d39\U52b2\U7684";
fakeAns3 = "\U5435\U95f9\U7684";
word = "\U3042\U305f\U3089\U3057\U3044";
},
{
TrueAns = "\U5f00\U5fc3\U7684";
fakeAns1 = "\U751f\U6c14\U7684";
fakeAns2 = "\U60b2\U4f24\U7684";
fakeAns3 = "\U9965\U997f\U7684";
word = "\U3046\U308c\U3057\U3044";
}
)
2019-02-28 10:45:51.640028+0800 WordBank[1230:201778] ==============(
{
TrueAns = "\U6905\U5b50";
fakeAns1 = "\U68b3\U5b50";
fakeAns2 = "\U4e66\U5305";
fakeAns3 = "\U684c\U5b50";
word = "\U3044\U3059";
},
{
TrueAns = "\U59b9\U59b9";
fakeAns1 = "\U5f1f\U5f1f";
fakeAns2 = "\U59d0\U59d0";
fakeAns3 = "\U54e5\U54e5";
word = "\U3044\U3082\U3046\U3068";
},
{
TrueAns = "\U5927\U6d77";
fakeAns1 = "\U866b\U5b50";
fakeAns2 = "\U5c71";
fakeAns3 = "\U9ca8\U9c7c";
word = "\U3046\U307f";
},
{
TrueAns = "\U4f46\U662f";
fakeAns1 = "\U6240\U4ee5";
fakeAns2 = "\U56e0\U4e3a";
fakeAns3 = "\U53ef\U80fd";
word = "\U3068\U3053\U308d\U304c";
},
{
TrueAns = "\U5403\U996d";
fakeAns1 = "\U4f11\U606f";
fakeAns2 = "\U6563\U6b65";
fakeAns3 = "\U5435\U67b6";
word = "\U3084\U3059\U3080";
},
{
TrueAns = "\U6628\U5929";
fakeAns1 = "\U53bb\U5e74";
fakeAns2 = "\U4eca\U5e74";
fakeAns3 = "\U660e\U5929";
word = "\U304d\U306e\U3046";
},
{
TrueAns = "\U5fd8\U8bb0";
fakeAns1 = "\U6d17";
fakeAns2 = "\U5403\U996d";
fakeAns3 = "\U7761\U89c9";
word = "\U308f\U3059\U308c\U308b";
},
{
TrueAns = "\U9c7c";
fakeAns1 = "\U9a6c";
fakeAns2 = "\U9752\U86d9";
fakeAns3 = "\U91ce\U732a";
word = "\U3055\U304b\U306a";
},
{
TrueAns = "\U65b0\U7684";
fakeAns1 = "\U53ef\U7231\U7684";
fakeAns2 = "\U8d39\U52b2\U7684";
fakeAns3 = "\U5435\U95f9\U7684";
word = "\U3042\U305f\U3089\U3057\U3044";
},
{
TrueAns = "\U5f00\U5fc3\U7684";
fakeAns1 = "\U751f\U6c14\U7684";
fakeAns2 = "\U60b2\U4f24\U7684";
fakeAns3 = "\U9965\U997f\U7684";
word = "\U3046\U308c\U3057\U3044";
}
)
你把代码贴出来,打印的顺序不对。
//
// WordTestViewController.m
// WordBank
//
// Created by Peter on 2019/2/27.
// Copyright © 2019年 Hisen. All rights reserved.
//
#import "WordTestViewController.h"
#import <BmobSDK/Bmob.h>
#define RGBACOLOR(R,G,B,A) [UIColor colorWithRed:R/255.0 green:G/255.0 blue:B/255.0 alpha:A]
@interface WordTestViewController ()
@property (strong, nonatomic) IBOutlet UIView *testView;
@property (strong, nonatomic) NSArray *dataArray;
@property (weak, nonatomic) IBOutlet UILabel *wordLabel;
@property (weak, nonatomic) IBOutlet UILabel *choiceA;
@property (weak, nonatomic) IBOutlet UILabel *choiceB;
@property (weak, nonatomic) IBOutlet UILabel *choiceC;
@property (weak, nonatomic) IBOutlet UILabel *choiceD;
@end
@implementation WordTestViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
__weak typeof (self) weakSelf = self;
[self configDataWithClas:@"" successBlock:^(NSArray *returnList) {
weakSelf.dataArray = returnList;
NSLog(@"==============%@",returnList);
NSLog(@"==============%@",weakSelf.dataArray);
// [weakSelf.tableView reloadData];
}];
NSLog(@"\n self.dataArray:\n%@",self.dataArray);
}
-(NSArray *)dataArray
{
if (_dataArray == nil) {
_dataArray = [NSArray array];
}
return _dataArray;
}
-(void)layoutUI
{
self.testView.layer.cornerRadius = 20;
self.testView.layer.shadowOffset = CGSizeMake(0, 2.5);
self.testView.layer.shadowOpacity = 0.3;
self.testView.layer.shadowColor = RGBACOLOR(0, 0, 0, 1).CGColor;
}
//-(void)configDataWithClas:(NSString *)class
//{
// BmobQuery* query = [BmobQuery queryWithClassName:@"wordTest"];
// [query whereKey:@"class" equalTo:class];
// [query setLimit:10];
// __block NSMutableArray *mutalArray = [NSMutableArray array];
// __weak typeof(self) weakSelf = self;
// [query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
// for (BmobObject *obj in array) {
// NSMutableDictionary *mutalDict = [[NSMutableDictionary alloc] init];
// [mutalDict setObject:[obj objectForKey:@"word"] forKey:@"word"];
// [mutalDict setObject:[obj objectForKey:@"TrueAns"] forKey:@"TrueAns"];
// [mutalDict setObject:[obj objectForKey:@"fakeAns1"] forKey:@"fakeAns1"];
// [mutalDict setObject:[obj objectForKey:@"fakeAns2"] forKey:@"fakeAns2"];
// [mutalDict setObject:[obj objectForKey:@"fakeAns3"] forKey:@"fakeAns3"];
// [mutalArray addObject:mutalDict];
// }
// weakSelf.dataArray = [mutalArray copy];
// NSLog(@"\n block内部的mutalArray:\n %@",mutalArray);
// }];
// NSLog(@"\n block外部的mutalArray:\n %@",mutalArray);
//}
-(void)configDataWithClas:(NSString *)class successBlock:(void (^)(NSArray *returnList))successBlock
{
BmobQuery* query = [BmobQuery queryWithClassName:@"wordTest"];
[query whereKey:@"class" equalTo:class];
[query setLimit:10];
__block NSMutableArray *mutalArray = [NSMutableArray array];
// __weak typeof(self) weakSelf = self;
[query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
for (BmobObject *obj in array) {
NSMutableDictionary *mutalDict = [[NSMutableDictionary alloc] init];
[mutalDict setObject:[obj objectForKey:@"word"] forKey:@"word"];
[mutalDict setObject:[obj objectForKey:@"TrueAns"] forKey:@"TrueAns"];
[mutalDict setObject:[obj objectForKey:@"fakeAns1"] forKey:@"fakeAns1"];
[mutalDict setObject:[obj objectForKey:@"fakeAns2"] forKey:@"fakeAns2"];
[mutalDict setObject:[obj objectForKey:@"fakeAns3"] forKey:@"fakeAns3"];
[mutalArray addObject:mutalDict];
}
if(successBlock){
successBlock([mutalArray copy]);
}
}];
}
-(void)didClickChoiceLabel:(NSString *)choiceText
{
}
@end
-(void)configDataWithClas:(NSString *)class successBlock:(void (^)(NSArray *returnList))successBlock
{
BmobQuery* query = [BmobQuery queryWithClassName:@"wordTest"];
[query whereKey:@"class" equalTo:class];
[query setLimit:10];
__block NSMutableArray *mutalArray = [NSMutableArray array];
__weak typeof(self) weakSelf = self;
[query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
for (BmobObject *obj in array) {
NSMutableDictionary *mutalDict = [[NSMutableDictionary alloc] init];
[mutalDict setObject:[obj objectForKey:@"word"] forKey:@"word"];
[mutalDict setObject:[obj objectForKey:@"TrueAns"] forKey:@"TrueAns"];
[mutalDict setObject:[obj objectForKey:@"fakeAns1"] forKey:@"fakeAns1"];
[mutalDict setObject:[obj objectForKey:@"fakeAns2"] forKey:@"fakeAns2"];
[mutalDict setObject:[obj objectForKey:@"fakeAns3"] forKey:@"fakeAns3"];
[mutalArray addObject:mutalDict];
}
if(successBlock){
successBlock([mutalArray copy]);
}
}];
}
- (void)viewDidLoad {
[super viewDidLoad];
__weak typeof (self) weakSelf = self;
[self configDataWithClas:@"" successBlock:^(NSArray *returnList) {
weakSelf.dataArray = returnList;
NSLog(@"==============%@",returnList);
NSLog(@"==============%@",weakSelf.dataArray);
[weakSelf.tableView reloadData];
}];
}
2019-02-28 10:27:47.277913+0800 WordBank[1213:198371]
self.dataArray:
(
)
2019-02-28 10:27:47.402890+0800 WordBank[1213:198371] ==============(
)
2019-02-28 10:27:47.402964+0800 WordBank[1213:198371] ==============(
)
其实都说的没错 只是你这个循环中数据解析速度的问题,导致赋值的时候 拿不准数据,有时候会有这也的问题!所以这种必须要立马得到数据,最好是做成同步block
-(void)configDataWithClas:(NSString *)class successBlock:(void (^)(NSArray *returnList))successBlock
{
BmobQuery* query = [BmobQuery queryWithClassName:@"wordTest"];
[query whereKey:@"class" equalTo:class];
[query setLimit:10];
__block NSMutableArray *mutalArray = [NSMutableArray array];
__weak typeof(self) weakSelf = self;
[query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
for (BmobObject *obj in array) {
NSMutableDictionary *mutalDict = [[NSMutableDictionary alloc] init];
[mutalDict setObject:[obj objectForKey:@"word"] forKey:@"word"];
[mutalDict setObject:[obj objectForKey:@"TrueAns"] forKey:@"TrueAns"];
[mutalDict setObject:[obj objectForKey:@"fakeAns1"] forKey:@"fakeAns1"];
[mutalDict setObject:[obj objectForKey:@"fakeAns2"] forKey:@"fakeAns2"];
[mutalDict setObject:[obj objectForKey:@"fakeAns3"] forKey:@"fakeAns3"];
[mutalArray addObject:mutalDict];
}
if(successBlock){
successBlock([mutalArray copy]);
}
}];
}
- (void)viewDidLoad {
[super viewDidLoad];
__weak typeof (self) weakSelf = self;
[self configDataWithClas:@"" successBlock:^(NSArray *returnList) {
weakSelf.dataArray = returnList;
NSLog(@"==============%@",returnList);
NSLog(@"==============%@",weakSelf.dataArray);
[weakSelf.tableView reloadData];
}];
}
在外面打印肯定没有数据,数据查询是异步操作,在外部打印时没有返回查询结果, 用`Block`回调是在为了保证查询成功后,在进行`UI`赋值操作, 把所有的`UI`都放到`Block`中执行即可:[self configDataWithClas:@"N4" successBlock:^(NSArray *returnList) { // 在这里更新UI和赋值操作 }];
把你的操作放到block中,如果需要确保在主线程中更新ui,使用dispatch_sync(dispatch_get_main_queue(),^{ //ui操作 });