Cocoa-touch:当使用额外的线程时,似乎会跳过代码

时间:2014-01-28 19:35:56

标签: ios multithreading grand-central-dispatch

我是iOS开发的新手,我正在学习一些在线教程,最新的是块和多线程。示例应用程序从Flickr中提取照片,用户可以分别浏览和使用表视图控制器和滚动视图进行查看。

问题是没有多线程,照片是从Flickr获得并正确加载的,尽管这都是在主线程中完成的。我完全按照教练的说法添加了三行看似简单的代码。他的应用程序在演示中正常运行,我的运行但现在似乎跳过调度到新线程的代码。没有图片加载。这是代码:

- (void)loadPhotos
{
    [self.refreshControl beginRefreshing];
    dispatch_queue_t loaderQ = dispatch_queue_create("newphotos", NULL);
    dispatch_async(loaderQ, ^{
        NSArray *newPhotos = [FlickrFetcher getPhotos];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.photos = newPhotos;
            [self.refreshControl endRefreshing];
        });
    });
}

如果我注释掉3个“dispatch”行以及关闭块的两行,则代码运行并加载图片。如上所示,代码运行但没有获取图片。调试器似乎跳过了块中的代码,所以我不相信这一行:      NSArray *newPhotos = [FlickrFetcher getPhotos]; 实际上是跑了。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

你的dispatch_queue在有机会执行之前就会被释放。您应该抓住它并在完成时使用dispatch_release将其释放。