访问块内的实例变量-Objective-C



我有我的实例变量声明:

@interface TimelineTableViewController ()
@property (strong, nonatomic) NSMutableArray *avatars;
@end

然后是我的区块:

void UIImageFromURL(NSURL *URL, NSString *key, void(^imageBlock)(UIImage *image), void(^errorBlock)(void)) {
    dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
        NSData  *data  = [[NSData alloc] initWithContentsOfURL:URL];
        UIImage *image = [[UIImage alloc] initWithData:data];
        dispatch_async( dispatch_get_main_queue(), ^(void){
            if (image != nil) {
                [self.avatars setObject:image forKey:key];
                NSLog(@"%@", self.avatars);
                imageBlock( image );
            } else {
                errorBlock();
            }
        });
    });
}

我想做的是将下载的映像缓存到实例数组中,以避免每次重新创建TableCell时都重新下载。然而,我得到了错误:

Use of undeclared identifier 'self'

如果有帮助的话,我会这样称呼我的区块:

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TweetCell *cell = (TweetCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    NSDictionary *tweetObject = _tweets[indexPath.row];
    NSDictionary *userObject = tweetObject[@"user"];
    NSString *avatarURL = userObject[@"profile_image_url"];
    avatarURL = [avatarURL stringByReplacingOccurrencesOfString:@"_normal"
                                                     withString:@""];
    NSURL *imageURL = [NSURL URLWithString:avatarURL];
    UIImageFromURL(imageURL, avatarURL, ^(UIImage *image) {
        [cell.avatarImage setImage:image];
    }, ^{
        NSLog(@"Failed to fetch profile picture.");
    });
    return cell;
}

在您的块之前,使用这行代码修改您的self:

// Weak self
__weak MyViewController *weakSelf = self;

并这样调用您的变量:

void UIImageFromURL(NSURL *URL, NSString *key, void(^imageBlock)(UIImage *image), void(^errorBlock)(void)) {
    dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
        NSData  *data  = [[NSData alloc] initWithContentsOfURL:URL];
        UIImage *image = [[UIImage alloc] initWithData:data];
        dispatch_async( dispatch_get_main_queue(), ^(void){
            if (image != nil) {
                [weakSelf.avatars setObject:image forKey:key];
                NSLog(@"%@", weakSelf.avatars);
                imageBlock( image );
            } else {
                errorBlock();
            }
        });
    });
}

您可以参考此处获得关于block的完整答案!

您可以使UIImageFromURL()成为实例方法,而不是普通的C函数,则它可以访问self:

- (void)fetchImageFromURL:(NSURL *)URL key:(NSString *)key imageBlock:(void(^)(UIImage *image))imageBlock errorBlock:(void (^)(void))errorBlock
{
    dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
        NSData  *data  = [[NSData alloc] initWithContentsOfURL:URL];
        UIImage *image = [[UIImage alloc] initWithData:data];
        dispatch_async( dispatch_get_main_queue(), ^(void){
            if (image != nil) {
                [self.avatars setObject:image forKey:key];
                NSLog(@"%@", self.avatars);
                imageBlock( image );
            } else {
                errorBlock();
            }
        });
    });
}

然后称之为

[self fetchImageFromURL:imageURL key:avatarURL imageBlock:^(UIImage *image) {
    [cell.avatarImage setImage:image];
} errorBlock:^{
    NSLog(@"Failed to fetch profile picture.");
}];

您的代码不是一个方法,而是一个简单的C函数。因此,不存在"自我"。类方法以"+"开头,实例方法以"-"开头。

最新更新