0

嗨,我正在尝试将队列和块用于多线程,但我无法从这些块中访问属性。当我使用 NSLog 打印 self.photoArray 的值时,我得到空值。有人可以解释我做错了什么吗?我试过这个

 dispatch_queue_t downloadQueue = dispatch_queue_create("flickrDownload", NULL);

    dispatch_async(downloadQueue, ^{                                 

        NSArray* photos = [FlickrPhotoSort sortTopPlaces];

        dispatch_async(dispatch_get_main_queue(), ^{

            self.photoArray = photos; });


    });

    dispatch_release(downloadQueue);

而这不使用主队列。

 dispatch_queue_t downloadQueue = dispatch_queue_create("flickrDownload", NULL);

dispatch_async(downloadQueue, ^{                                 

    NSArray* photos = [FlickrPhotoSort sortTopPlaces];

        self.photoArray = photos; 

});

dispatch_release(downloadQueue);

这是 photoArray 的设置器

-(void) setPhotoArray:(NSArray *)photoArray{
    if(!_photoArray) _photoArray = [[NSArray alloc] initWithArray:photoArray];
else 
    _photoArray = photoArray;

}

我正在关注斯坦福的在线课程,老师只是这样称呼该物业,它似乎有效

dispatch_queue_t downloadQueue = dispatch_queue_create("flickr downloader", NULL);
    dispatch_async(downloadQueue, ^{
        NSArray *photos = [FlickrFetcher recentGeoreferencedPhotos];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.navigationItem.rightBarButtonItem = sender;
            self.photos = photos;
        });
    });
    dispatch_release(downloadQueue);
4

3 回答 3

1

当我使用 NSLog 打印 self.photoArray 的值时,我得到空值。

[FlickrPhotoSort sortTopPlaces]当您点击日志语句并且尚未设置属性时,异步运行可能仍在运行。

于 2012-08-08T22:30:22.557 回答
-1

由于属性调用方法调用,我在块内设置它们没有问题。__block 仅将可见性添加到块范围之外的变量 - 以便在块范围之外看到从块内对变量的更改。它仅对直接在块中使用 var (无论是否为 ivars)对属性没有影响。属性不是 ivars,它们是对在块范围之外设置 ivar 的类的显式方法调用。

不过,您应该在设置器中保留照片阵列 - 否则阵列将在块的末尾释放。我在块中拥有大量代码设置属性,没有任何问题。

于 2012-08-08T22:12:10.627 回答
-2

在块中使用 iVar 的关键字__block。这可以确保该属性保留在内存中。如果您使用 ARC 和 5.0 之前的版本,请使用__unsafe_unretainedelse__weak

__block NSArray *bPhotoArray = self.bPhotoArray;
dispatch_async(downloadQueue, ^{                                 

    NSArray* photos = [FlickrPhotoSort sortTopPlaces];
        bPhotoArray = photos; 
});
于 2012-08-08T22:01:12.493 回答