在方法块中使用方法声明中的变量时出错"variable is not assignable (missing __block type specifier)"



我正在开发一个从服务器检索信息的小型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];,我不知道如何继续。所以我的想法是,我不想像以前那样为我拥有的每个数组创建一个方法,而是想将数组作为变量传递,并在方法中更新它。如何做到这一点?谢谢

如果您想访问块中的变量,那么您应该像__block NSArray *arr;一样首先将其分配为块。然后您可以在完成处理程序中访问block means中的变量。

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

__block NSArray *arr =  objectArray;

然后在类似块的中使用这个arr

 arr = [objectModel arrayFromDictionary:jsonDataDictionary];

希望这将有所帮助:)

而不是

objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];

尝试

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

这是因为进入的变量前面没有__block,因此可以在块中使用,这只适用于局部变量,而不适用于参数。我相信__block是在允许在块内引用的情况下做的。

相关内容

最新更新