2012-08-02 20 views
0

这只有当上述项目已在此应用程序的运行产生反应。如果先前创建了条目,它会很好地获取图像。后台线程返回的UIImage的结果作为零

此代码的工作,而无需使用后台线程精细,所以它使我相信这是问题的一部分。下面的代码我有:

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; 

} 

的的NSLog在getThumbnailWithSave返回作为一个UIImage,其他的NSLog返回作为零。

+2

'GET'不应该被用作此类型的方法前缀.... – bbum 2012-08-02 17:58:23

+0

你的问题中有太多的代码。如果您将问题归结为重要的领域,那么我们就可以更容易地找出问题所在。如果我不得不猜测,我会说这是因为图像还没有被创建,或者当后台线程尝试访问它时已经被释放。 – Dustin 2012-08-02 18:05:46

+0

@Dustin我现在已经削减了一点。如果这可能是问题,我该如何阻止图像被释放?你的意思是什么没有被创造出来?我向你展示了上面创建的所有元素。 – Andrew 2012-08-02 18:12:56

回答

1

我有这个问题解释说是很久以前,我认为这是我的固定它。

调用getThumbnail需要调用背面的主线程上。

所以增加一些如:

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

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

再次,这是从我的头顶,但我敢肯定,这是我去了。

+0

我认为你是对的。问题是这会冻结用户界面。这有没有其他变数?一种避开它冻结UI的方法? – Andrew 2012-08-02 19:11:31

+0

也许把getThumbnail的内容移动到原来的异步块内? – random 2012-08-02 19:43:37

+0

我试过了。它正在访问导致崩溃的任何核心数据项。我认为这与新创建的核心数据有关,因为只有在该运行中创建条目时才会发生这种情况。 – Andrew 2012-08-02 20:34:57