“变量不可赋值(缺少__block类型说明符)”在方法块中使用方法声明中的变量时出错

问题描述 投票:2回答:2

我正在开发一个从服务器检索信息的小型iOs应用程序,我找到了非常有用的NSURLSessionDataTask。首先,我使用了@property (nonatomic, strong) NSMutableArray *objectArray;,我在我的方法中调用了它:

    - (void) createObjectsArrayFromUrl: (NSString *) url {
NSURL *URL = [NSURL URLWithString:url];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                        completionHandler:
                              ^(NSData *data, NSURLResponse *response, NSError *error) {
                                  if(error) {
                                      //error handling
                                  }
                                  dispatch_async(dispatch_get_main_queue(), ^{

                                     NSMutableDictionary *jsonDataDictionary = [objectModel getJsonData];

                    self.objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];

                                      [[self collectionView] reloadData];

                                  });
                              }];
[task resume];
}

一切顺利。现在我想为更多数组创建一个通用方法,我想通过将数组传递给方法并在里面更新它来做到这一点,如下所示:

- (void) createObjectsArrayFromUrl: (NSString *) url inArray: (NSMutableArray *) objectArray{
    NSURL *URL = [NSURL URLWithString:url];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                            completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {
                                      if(error) {
                                          //error handling
                                      }
                                      dispatch_async(dispatch_get_main_queue(), ^{

                                         NSMutableDictionary *jsonDataDictionary = [objectModel getJsonData];

                        objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];

                                          [[self collectionView] reloadData];

                                      });
                                  }];
    [task resume];
    }

但它给了我以下行标题中的错误:objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];,我不知道如何继续。所以我的想法是,不是像以前那样为我拥有的每个数组创建一个方法,而是希望将数组作为变量传递并在方法中更新它。怎么做到这一点?谢谢。

ios objective-c
2个回答
1
投票

代替

objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];

尝试

[objecyArray removeAllObjects];
[objectArray addObjectsFromArray:[objectModel arrayFromDictionary:jsonDataDictionary]];

这是因为进入的变量在它前面没有__block,因此允许它在块中使用,这仅适用于局部变量而不是参数。我相信__block在引擎盖下的内容允许在块内引用。


11
投票

如果你想在块中访问变量,那么你应该像__block NSArray *arr;一样将它分配为块。然后你可以在完成处理程序中以块的方式访问该变量。

在您的代码中,您可以在方法体的开头添加一行,如,

__block NSArray *arr =  objectArray;

然后在块中使用这个arr

 arr = [objectModel arrayFromDictionary:jsonDataDictionary];

希望这会有所帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.