【问题标题】:"variable is not assignable (missing __block type specifier)" error when using a variable from method declaration in method block在方法块中使用方法声明中的变量时出现“变量不可赋值(缺少 __block 类型说明符)”错误
【发布时间】:2016-04-12 12:55:08
【问题描述】:

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

【问题讨论】:

  • 而不是将 objectArray 分配给 [objectModel arrayFromDictionary:jsonDataDictionary];,尝试 [objecyArray removeAllObjects], [objectArray addObjectsFromArray:[objectModel arrayFromDictionary:jsonDataDictionary]];
  • 谢谢,现在可以使用了!愿意解释一下吗?我是 Obj-C 世界的新手!
  • 添加为答案:D

标签: ios objective-c


【解决方案1】:

如果要访问块中的变量,则应首先将其分配为块,例如__block NSArray *arr;。然后您可以在完成处理程序中以块方式访问该变量。

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

__block NSArray *arr =  objectArray;

然后在块中使用这个arr

 arr = [objectModel arrayFromDictionary:jsonDataDictionary];

希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    代替

    objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];
    

    试试

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

    这是因为传入的变量前面没有__block,因此可以在块中使用,这仅适用于局部变量而不是参数。我相信__block 这样做是为了允许在块内被引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      相关资源
      最近更新 更多