Procházet zdrojové kódy

fix CoreData threading issues which surfaced in WatchKit App

Tobias Conradi před 10 roky
rodič
revize
2241a53e16
1 změnil soubory, kde provedl 41 přidání a 6 odebrání
  1. 41 6
      Sources/VLCThumbnailsCache.m

+ 41 - 6
Sources/VLCThumbnailsCache.m

@@ -8,6 +8,7 @@
  * Authors: Gleb Pinigin <gpinigin # gmail.com>
  *          Felix Paul Kühne <fkuehne # videolan.org>
  *          Carola Nitz <caro # videolan.org>
+ *          Tobias Conradi <videolan # tobias-conradi.de>
  *
  * Refer to the COPYING file of the official project for license.
  *****************************************************************************/
@@ -84,11 +85,9 @@
     } else if ([object isKindOfClass:[MLLabel class]]) {
         thumbnail = [cache thumbnailForLabel:(MLLabel *)object];
     } else if ([object isKindOfClass:[MLAlbum class]]) {
-        MLFile *anyFileFromAnyTrack = [[(MLAlbum *)object tracks].anyObject files].anyObject;
-        thumbnail = [cache thumbnailForMediaFile:anyFileFromAnyTrack];
+        thumbnail = [cache thumbnailForAlbum:(MLAlbum *)object];
     } else if ([object isKindOfClass:[MLAlbumTrack class]]) {
-        MLFile *anyFileFromTrack = [(MLAlbumTrack *)object files].anyObject;
-        thumbnail = [cache thumbnailForMediaFile:anyFileFromTrack];
+        thumbnail = [cache thumbnailForAlbumTrack:(MLAlbumTrack *)object];
     } else {
         thumbnail = [cache thumbnailForMediaFile:(MLFile *)object];
     }
@@ -129,8 +128,17 @@
     if (displayedImage)
         return displayedImage;
 
-    if (!displayedImage)
-        displayedImage = mediaFile.computedThumbnail;
+    if (!displayedImage) {
+        __block UIImage *computedImage = nil;
+        void (^getThumbnailBlock)(void) = ^(){
+            computedImage = mediaFile.computedThumbnail;
+        };
+        if ([NSThread isMainThread])
+            getThumbnailBlock();
+        else
+            dispatch_sync(dispatch_get_main_queue(), getThumbnailBlock);
+        displayedImage = computedImage;
+    }
 
     if (displayedImage)
         [_thumbnailCache setObject:displayedImage forKey:objID];
@@ -207,6 +215,33 @@
     return displayedImage;
 }
 
+- (UIImage *)thumbnailForAlbum:(MLAlbum *)album
+{
+    __block MLAlbumTrack *track = nil;
+    void (^getFileBlock)(void) = ^(){
+        track = [album tracks].anyObject;
+    };
+    if ([NSThread isMainThread])
+        getFileBlock();
+    else
+        dispatch_sync(dispatch_get_main_queue(), getFileBlock);
+
+    return [self thumbnailForAlbumTrack:track];
+}
+
+- (UIImage *)thumbnailForAlbumTrack:(MLAlbumTrack *)albumTrack
+{
+    __block MLFile *anyFileFromAnyTrack = nil;
+    void (^getFileBlock)(void) = ^(){
+        anyFileFromAnyTrack = [albumTrack files].anyObject;
+    };
+    if ([NSThread isMainThread])
+        getFileBlock();
+    else
+        dispatch_sync(dispatch_get_main_queue(), getFileBlock);
+    return [self thumbnailForMediaFile:anyFileFromAnyTrack];
+}
+
 - (UIImage *)clusterThumbFromFiles:(NSArray *)files andNumber:(NSUInteger)fileNumber blur:(BOOL)blurImage
 {
     UIImage *clusterThumb;