Ensure we always set the UIKit image properties from the main thread (fix #403, fix #417, fix #398)

This commit is contained in:
Olivier Poitrey 2013-06-12 17:01:01 +02:00
parent 9a1f072e5e
commit c6664248f1
3 changed files with 73 additions and 25 deletions

View File

@ -49,15 +49,27 @@ static char operationKey;
__weak MKAnnotationView *wself = self;
id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
{
__strong MKAnnotationView *sself = wself;
if (!sself) return;
if (image)
if (!wself) return;
void (^block)(void) = ^
{
sself.image = image;
__strong MKAnnotationView *sself = wself;
if (!sself) return;
if (image)
{
sself.image = image;
}
if (completedBlock && finished)
{
completedBlock(image, error, cacheType);
}
};
if ([NSThread isMainThread])
{
block();
}
if (completedBlock && finished)
else
{
completedBlock(image, error, cacheType);
dispatch_sync(dispatch_get_main_queue(), block);
}
}];
objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

View File

@ -48,15 +48,27 @@ static char operationKey;
__weak UIButton *wself = self;
id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
{
__strong UIButton *sself = wself;
if (!sself) return;
if (image)
if (!wself) return;
void (^block)(void) = ^
{
[sself setImage:image forState:state];
__strong UIButton *sself = wself;
if (!sself) return;
if (image)
{
[sself setImage:image forState:state];
}
if (completedBlock && finished)
{
completedBlock(image, error, cacheType);
}
};
if ([NSThread isMainThread])
{
block();
}
if (completedBlock && finished)
else
{
completedBlock(image, error, cacheType);
dispatch_sync(dispatch_get_main_queue(), block);
}
}];
objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
@ -99,15 +111,27 @@ static char operationKey;
__weak UIButton *wself = self;
id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
{
__strong UIButton *sself = wself;
if (!sself) return;
if (image)
if (!wself) return;
void (^block)(void) = ^
{
[sself setBackgroundImage:image forState:state];
__strong UIButton *sself = wself;
if (!sself) return;
if (image)
{
[sself setBackgroundImage:image forState:state];
}
if (completedBlock && finished)
{
completedBlock(image, error, cacheType);
}
};
if ([NSThread isMainThread])
{
block();
}
if (completedBlock && finished)
else
{
completedBlock(image, error, cacheType);
dispatch_sync(dispatch_get_main_queue(), block);
}
}];
objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

View File

@ -54,16 +54,28 @@ static char operationKey;
__weak UIImageView *wself = self;
id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
{
__strong UIImageView *sself = wself;
if (!sself) return;
if (image)
if (!wself) return;
void (^block)(void) = ^
{
sself.image = image;
[sself setNeedsLayout];
__strong UIImageView *sself = wself;
if (!sself) return;
if (image)
{
sself.image = image;
[sself setNeedsLayout];
}
if (completedBlock && finished)
{
completedBlock(image, error, cacheType);
}
};
if ([NSThread isMainThread])
{
block();
}
if (completedBlock && finished)
else
{
completedBlock(image, error, cacheType);
dispatch_sync(dispatch_get_main_queue(), block);
}
}];
objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);