我想添加到UIImageView設置圖片的URL的能力。因此我想要做類似的事情。異步請求和委託可能帶來的風險
[anImageView setImageWithContentAtUrl:[NSURL URLWithString:@"http://server.com/resource.png"]];
所以我創建了一個類(下面的代碼)。
NSString *kUserInfoImageViewKey = @"imageView";
NSString *kUserInfoActivityIndicatorKey = @"activityIndicator";
@implementation UIImageView (asynchronous)
#pragma mark -
- (void)setImageWithContentAtUrl:(NSURL *)imageUrl andActivityIndicator:(UIActivityIndicatorView *)activityIndicatorOrNil {
[activityIndicatorOrNil startAnimating];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:self forKey:kUserInfoImageViewKey];
[dict setValue:activityIndicatorOrNil forKey:kUserInfoActivityIndicatorKey];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:imageUrl];
request.delegate = self;
request.userInfo = dict;
[dict release];
[request startAsynchronous];
}
#pragma mark -
#pragma mark private
- (void)requestFinished:(ASIHTTPRequest *)aRequest {
// get concerned view from user info
NSDictionary *dictionary = aRequest.userInfo;
UIImageView *imageView = (UIImageView *)[dictionary valueForKey:kUserInfoImageViewKey];
UIActivityIndicatorView *activityIndicator = (UIActivityIndicatorView *) [dictionary valueForKey:kUserInfoActivityIndicatorKey];
[activityIndicator stopAnimating];
NSData *responseData = [aRequest responseData];
UIImage * image = [[UIImage alloc] initWithData:responseData];
imageView.image = image;
[image release];
}
- (void)requestFailed:(ASIHTTPRequest *)request {
}
一個ASIHTTPRequest被創建並且以圖像作爲委託來啓動。如果在ASIHTTPRequest返回結果之前解除分配圖像,我認爲存在風險。因此,也許在setImageWithContentAtUrl中添加一個保留:並在requestFinished和requestFailed中添加一個版本:但我並不十分自信。
怎麼可能做這樣的事情?
問候, 昆汀
如果我在setImageWithContentAtUrl中保留圖像並在ASIHTTPRequest回調中釋放,它是否工作? - (無效)setImageWithContentAtUrl:(NSURL *)IMAGEURL andActivityIndicator:(UIActivityIndicatorView *)activityIndicatorOrNil { ... [自保留]; [request startAsynchronous]; } - (void)requestFinished:(ASIHTTPRequest *)aRequest {...} [self release]; (void)requestFailed:(ASIHTTPRequest *)request { } [self release]; } 一些副作用? Regards, – Quentin 2010-10-31 16:04:13