UIImage 的后台线程返回结果为 nil

Posted

技术标签:

【中文标题】UIImage 的后台线程返回结果为 nil【英文标题】:Background thread returning result of UIImage as nil 【发布时间】:2012-08-02 17:37:25 【问题描述】:

仅当在此应用程序运行中创建条目时才会发生这种情况。如果之前创建了条目,它会很好地获取图像。

这段代码在不使用后台线程的情况下运行良好,所以它让我相信它是问题的一部分。这是我的代码:

NSMutableDictionary *thumbnails = [[NSMutableDictionary alloc] init];

            dispatch_queue_t thumbnailSetupQueue = dispatch_queue_create("com.App.SetupTimelineThumbnails", NULL);
            dispatch_async(cellSetupQueue, ^

                NSManagedObjectContext *newMoc = [[NSManagedObjectContext alloc] init];
                NSPersistentStoreCoordinator *coordinator = [NSManagedObjectContext contextForCurrentThread].persistentStoreCoordinator;
                [newMoc setPersistentStoreCoordinator:coordinator];

                NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
                [notify addObserver:self
                           selector:@selector(mergeChanges:)
                               name:NSManagedObjectContextDidSaveNotification
                             object:newMoc];

                Media *media = [localEntry.media anyObject];

                UIImage *image = [media getThumbnail];

                NSLog(@"image: %@", image);

                [[NSNotificationCenter defaultCenter] removeObserver:self];
            );

            dispatch_release(cellSetupQueue);

然后

-(UIImage *)getThumbnail 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:
                          [NSString stringWithFormat:@"%@-%@.jpg",
                           self.mediaID,
                           THUMBNAIL_FILENAME]];

    UIImage *thumbnail = [UIImage imageWithContentsOfFile:fullPath];

    NSLog(@"correct size thumbnail: %@", correctSizeThumbnail);

    return correctSizeThumbnail;


getThumbnailWithSave 中的 NSLog 返回 UIImage,其他 NSLog 返回 nil。

【问题讨论】:

get 不应用作此类方法的前缀...... 您的问题包含太多代码。如果您将问题缩减到重要的领域,我们将更容易找出问题所在。如果我不得不猜测,我会说这是因为当后台线程尝试访问它时,图像尚未创建或已被释放。 @Dustin 我现在已经减少了一点。如果这可能是问题,我如何阻止图像被释放?没有创建是什么意思?我向您展示了上面创建的所有元素。 您正在使用async 操作,因此您必须确保每当后台线程需要某些东西时,它已经被创建或未被删除。老实说,对我来说仍然有太多代码无法完成,但请尝试增加后台线程所需的变量范围。 现在更短了。扩大范围是什么意思? 【参考方案1】:

我很久以前就解释过这个问题,我认为这就是我解决它的方法。

调用 getThumbnail 需要在主线程上回调。

所以添加如下内容:

UIImage *image;
dispatch_async(dispatch_get_main_queue(), ^
    image = [media getThumbnail];
);

UIImage *image = [media performSelectorOnMainThread:@selector(getThumbnail) withObject: nil, waitUntilDone:NO];

这又是我的想法,但我很确定这就是我的做法。

【讨论】:

我认为你是对的。问题是这会冻结 UI。有替代方案吗?有一种方法可以解决冻结 UI 的问题? 也许将 getThumbnail 的内容移动到原始异步块内?? 我试过了。它正在访问导致崩溃的任何核心数据项。我认为这与新创建的核心数据有关,因为只有在该运行中创建了条目时才会发生这种情况。 哦,我明白了。我的核心数据技能有点欠缺。我希望我能提供更多帮助!

以上是关于UIImage 的后台线程返回结果为 nil的主要内容,如果未能解决你的问题,请参考以下文章

Magical Record - 在主线程块 ui 中获取,在后台返回 nil

UIImage返回nil但存在

无法设置 UIImage,总是返回 nil

UIImage 仅在 UIImageView 中返回 nil

将 UIImage 添加到数组后,NSMutableArray 返回 nil

iPhone - UIImage imageWithData 返回 nil