你如何刷新ABUnknownPersonViewController?

时间:2014-09-11 18:50:02

标签: objective-c xcode addressbook

我的问题:我有一个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]; //不工作'

请帮忙!

3 个答案:

答案 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无法在线程中更新。它必须在主线程上更新。