xhzengAIB/MessageDisplayKit — pull request #131 by DaidoujiChen (2014-08-13 09:16:33+00:00)
Title: 避免一些 CGContext 衍生的問題

根據 #130 的討論,

後面還會產生一些相關的 error,

: CGContextConcatCTM: invalid context 0x0.
: CGContextSetInterpolationQuality: invalid context 0x0.
: CGContextDrawImage: invalid context 0x0.
: CGBitmapContextCreateImage: invalid context 0x0.

仔細追下去的結果很妙, 真正的原因在於 `XHBubblePhotoImageView` 內的 method `configureMessagePhoto:thumbnailUrl:originPhotoUrl:onBubbleMessageType:`, 他裡面有一段 code 原先是這樣的

if (thumbnailUrl) {
WEAKSELF
[self addSubview:self.activityIndicatorView];
[self.activityIndicatorView startAnimating];
[self setImageWithURL:[NSURL URLWithString:thumbnailUrl] placeholer:nil showActivityIndicatorView:NO completionBlock:^(UIImage *image, NSURL *url, NSError *error) {
if ([url.absoluteString isEqualToString:thumbnailUrl]) {
// A 位置
image = [image thumbnailImage:CGRectGetWidth(weakSelf.bounds) * 2 transparentBorder:0 cornerRadius:0 interpolationQuality:1.0];
if (image) {
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.messagePhoto = image;
[weakSelf.activityIndicatorView stopAnimating];
});
}
}
}];
}

一般沒有發生狀況的時候, A 位置的 bound size 會正常, 不是 {0, 0, 0, 0} 的狀態, 但是如果發生問題的時候, A 位置的 size 就會是 {0, 0, 0, 0}, 繼續 run 則會發生 error, 實際上, 他並不是永遠都是 {0, 0, 0, 0}, 只是因為多線程的關係, `setFrame:` 慢於這邊的處理了, 只要 `setFrame:` 設給他一個新的值之後, 再繼續跑就會是正常, 所以下的解法是用一個 semaphore, 再發生問題的當下卡住線程, 等到被 `setFrame:` 之後再重新運行.

大概是這個樣子, 謝謝.