我的问题:我有一个ABUnknownPersonViewController需要从在线数据库中获取图像。我已经实现了NSSession来下载图像。线程将图像添加到ABRecordRef,然后将其添加到ABUnknownPersonViewController。当控制器被推到堆叠上时,它不会显示图像...因此悲伤随之而来。
NSString *imageUrl = dict[@"mug"];
__block NSURL *url = [NSURL URLWithString:imageUrl];
__block NSData *urlData = nil;
NSURLSessionConfiguration *sessionConfig =
[NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session =
[NSURLSession sessionWithConfiguration:sessionConfig
delegate:self
delegateQueue:nil];
NSURLSessionDownloadTask *getImageTask =
[session downloadTaskWithURL:[NSURL URLWithString:imageUrl]
completionHandler:^(NSURL *location,
NSURLResponse *response,
NSError *error) {
urlData = [NSData dataWithContentsOfURL:url];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
newPerson = controller.displayedPerson;
ABPersonSetImageData(newPerson, (__bridge CFDataRef)(urlData), &anError);
controller.displayedPerson = newPerson;
if(urlData != nil) {
NSLog(@"I got here");
[self viewWillAppear:YES];
[[NSNotificationCenter defaultCenter] postNotificationName:@"com.razeware.imagegrabber.imageupdated" object:(__bridge id)(newPerson)];
}
});
}];
[getImageTask resume];
**奇怪的是,如果我选择“创建新联系人”,图像就会出现(那么,线程是否正常工作?)。如果我在iPhone上单击取消,则图像将显示在ABUnknownPersonViewController上。因此,似乎控制器只需要刷新。怎么样?
我试过[[self view] setNeedsDisplay]; //不工作'
请帮忙!
答案 0 :(得分:1)
好的 - 这可能不是最好的做法。但是,由于您已经有[self viewWillAppear:YES];
,因此可以在viewWillAppear之前尝试调用[self viewWillDisappear:NO];
。这可能会刷新内容。
来自here。
答案 1 :(得分:1)
我最近遇到了类似的问题,并从其他地方获得了这个问题。尝试在异步后将调度同步添加到主队列,如下所示:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
dispatch_sync(dispatch_get_main_queue(), ^{
// your image fetch code here
});
});
答案 2 :(得分:0)
我找到了一个解决方案: ABRecordRef无法在线程中更新。它必须在主线程上更新。