block中为如何为全局变量赋值

Mr黄黄黄黄黄先森 2019-02-27 03:46:48

#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


使用bmob的SDK进行数据查询,返回之后的数组想赋值给self.dataArray,但是block这个数据结构还没弄清楚不知道怎么弄,在block中打印能看到数据,在block外打印就没是null

***********************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";
},

...全文
1065 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poco Carino 2019-03-01
  • 打赏
  • 举报
回复
好厉害。好厉害
  • 打赏
  • 举报
回复
引用 29 楼 So灬低调 的回复:
。。。。一般情况下他们说的方法都是可行了!要是还不行那就狠一点咯 while(1) { if(mutalArray.count!=0){ break; } }
我已经找到了一个可行的方法,就是在block中对数据进行持久化写入plist文件,然后用的时候再进行读取操作
So灬低调 2019-03-01
  • 打赏
  • 举报
回复
。。。。一般情况下他们说的方法都是可行了!要是还不行那就狠一点咯 while(1) { if(mutalArray.count!=0){ break; } }
瓶邪.slj 2019-03-01
  • 打赏
  • 举报
回复
引用 13 楼 Peter_Huang0623的回复:
引用 11 楼 So灬低调 的回复:
其实都说的没错 只是你这个循环中数据解析速度的问题,导致赋值的时候 拿不准数据,有时候会有这也的问题!所以这种必须要立马得到数据,最好是做成同步block
就是这个赋值只有在viewdidload()执行完之后才会赋上去,我在viewdididisappear或者viewwilldisappear中nslog可以看到结果,可是我对于UI的更新必须在viewdidiload中操作啊,我按照你上面的方法改了依旧block外为空
楼上说法同意,以前也朋友这样说
yewentao0823 2019-03-01
  • 打赏
  • 举报
回复
学习学习学习学习
So灬低调 2019-03-01
  • 打赏
  • 举报
回复
解决了就好!
So灬低调 2019-03-01
  • 打赏
  • 举报
回复
引用 30 楼 Peter_Huang0623 的回复:
[quote=引用 29 楼 So灬低调 的回复:]。。。。一般情况下他们说的方法都是可行了!要是还不行那就狠一点咯 while(1) { if(mutalArray.count!=0){ break; } }
我已经找到了一个可行的方法,就是在block中对数据进行持久化写入plist文件,然后用的时候再进行读取操作[/quote] 解析数据,存储数据入表,在读取数据,同样在block中需要更多的时间,在接下来打印数据依然还是同样的问题!如果解决了!可能是我们对你的需求不太了解
edondondon 2019-02-28
  • 打赏
  • 举报
回复
把你的操作放到block中,如果需要确保在主线程中更新ui,使用dispatch_sync(dispatch_get_main_queue(),^{ //ui操作 });
  • 打赏
  • 举报
回复
在外面打印肯定没有数据,数据查询是异步操作,在外部打印时没有返回查询结果, 用`Block`回调是在为了保证查询成功后,在进行`UI`赋值操作, 把所有的`UI`都放到`Block`中执行即可:

[self configDataWithClas:@"N4" successBlock:^(NSArray *returnList) {
   
   // 在这里更新UI和赋值操作

 }];
  • 打赏
  • 举报
回复
引用 15 楼 楼下如果是妹子那就 的回复:
你把代码贴出来,打印的顺序不对。


[self configDataWithClas:@"" successBlock:^(NSArray *returnList) {

}];

这个地方忘记传值了,但是现在不就是把数据从一个block放到了另一个block中吗?我在block外打印的self.dataArray还是为空啊

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";
}
)

  • 打赏
  • 举报
回复
引用 15 楼 楼下如果是妹子那就 的回复:
你把代码贴出来,打印的顺序不对。


//
// 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
  • 打赏
  • 举报
回复
你把代码贴出来,打印的顺序不对。
  • 打赏
  • 举报
回复
[quote=引用 12 楼 楼下如果是妹子那就 的回复:]

-(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];
}];
}



[/quote


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] ==============(
)
  • 打赏
  • 举报
回复
引用 11 楼 So灬低调 的回复:
其实都说的没错 只是你这个循环中数据解析速度的问题,导致赋值的时候 拿不准数据,有时候会有这也的问题!所以这种必须要立马得到数据,最好是做成同步block
就是这个赋值只有在viewdidload()执行完之后才会赋上去,我在viewdididisappear或者viewwilldisappear中nslog可以看到结果,可是我对于UI的更新必须在viewdidiload中操作啊,我按照你上面的方法改了依旧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];
    }];
}
So灬低调 2019-02-28
  • 打赏
  • 举报
回复
其实都说的没错 只是你这个循环中数据解析速度的问题,导致赋值的时候 拿不准数据,有时候会有这也的问题!所以这种必须要立马得到数据,最好是做成同步block
So灬低调 2019-02-28
  • 打赏
  • 举报
回复
mutalArray不用加修饰也没关系,都不行的话就强制使用同步转换 NSOperationQueue *queue = [NSOperationQueue mainQueue]; [queue addOperationWithBlock:^{ myAsyncBlock(xxxx) }];
hua397 2019-02-28
  • 打赏
  • 举报
回复
解决方法: NSMutableArray *mutalArray = [NSMutableArray new]; 把它改成 self.dataArray = [NSMutableArray new]; 同时,block内部用 [self.dataArray addObject:xxx]; 原因: 1. findObjectsInBackgroundWithBlock是一个异步操作,它会把task追加下一次runloop执行,你可以简单理解为block外的代码会被先执行,block内的代码晚一点才执行,所以block外先打印是个空数组,然后block才打印
  • 打赏
  • 举报
回复
引用 18 楼 楼下如果是妹子那就 的回复:
在外面打印肯定没有数据,数据查询是异步操作,在外部打印时没有返回查询结果, 用`Block`回调是在为了保证查询成功后,在进行`UI`赋值操作, 把所有的`UI`都放到`Block`中执行即可:

[self configDataWithClas:@"N4" successBlock:^(NSArray *returnList) {
   
   // 在这里更新UI和赋值操作

 }];
那我每更新一次岂不是就要调用这个block一次,我其实是做一个词汇量测试的功能,我想着一次性把数据加载完然后后面我还有很多事件来控制UI的更新,如果每次都要调用block来更新那很麻烦
  • 打赏
  • 举报
回复
引用 19 楼 edondondon 的回复:
把你的操作放到block中,如果需要确保在主线程中更新ui,使用dispatch_sync(dispatch_get_main_queue(),^{ //ui操作 });
我的需求就是从数据库中查询数据,在block回调中将查询到的数据赋值给self.dataArray,但是现在就是好像出了block数据就没了
加载更多回复(11)

29,028

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧