Просмотр изображения не обновляется в NSThread - PullRequest
3 голосов
/ 05 ноября 2010

Я пытаюсь создать тестовое приложение, которое измеряет производительность потоков.Тем не менее, я пытаюсь установить изображение для imageview в потоке, и он не обновляется.Фактически, методы setImage1 и setImage2 даже не вызываются.Есть идеи?Посмотрите на код для деталей

#import "UntitledAppDelegate.h"
#import <QuartzCore/QuartzCore.h>

@implementation UntitledAppDelegate

@synthesize window, imageView1, imageView2, label1, label2, label0;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{            
    [window makeKeyAndVisible];
    return YES;
}

-(IBAction) startSeparate:(id) sender
{
 imageView1.image = imageView2.image = nil;
 double prev;

    start = prev = CACurrentMediaTime(); 
 [self setImage1];
 label1.text = [NSString stringWithFormat:@"%.10g", CACurrentMediaTime() - prev];

 prev = CACurrentMediaTime();  
 [self setImage2];
 label2.text = [NSString stringWithFormat:@"%.10g", CACurrentMediaTime() - prev];
}

-(IBAction) startThreaded:(id) sender
{
 imageView1.image = imageView2.image = nil;
 double prev;

 NSThread *t1 = [[NSThread alloc] init];
 [t1 start];
 NSThread *t2 = [[NSThread alloc] init];
 [t2 start];

    start = prev = CACurrentMediaTime(); 
    //This doesn't work
    //[self performSelector:@selector(setImage1) onThread:t1 withObject:nil waitUntilDone:NO];

    //But this does
 [self performSelectorInBackground:@selector(setImage1) withObject:nil];

 label1.text = [NSString stringWithFormat:@"%.10g", CACurrentMediaTime() - prev];

 prev = CACurrentMediaTime();  
 //This doesn't work
    //[self performSelector:@selector(setImage2) onThread:t2 withObject:nil waitUntilDone:NO];

    //But this does
 [self performSelectorInBackground:@selector(setImage2) withObject:nil];

 label2.text = [NSString stringWithFormat:@"%.10g", CACurrentMediaTime() - prev];
}

-(void) setImage1
{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 UIImage *image1 = [UIImage imageNamed:@"bird.png"];
 imageView1.image = image1;
 [self pictureDone];
 [pool drain];
}

-(void) setImage2
{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 UIImage *image2 = [UIImage imageNamed:@"bird.png"];
 imageView2.image = image2;
 [self pictureDone];
 [pool drain];
}

-(void) pictureDone
{
 done++;
 NSLog(@"%i", done);
 if (done == 2) {
  label0.text = [NSString stringWithFormat:@"%.10g", CACurrentMediaTime() - start];
  done = 0;
 }
}
@end

Ответы [ 2 ]

5 голосов
/ 05 ноября 2010

Никогда ничего не меняйте в текущем отображаемом UIView из фонового потока.Существует миллион различных проблем синхронизации, с которыми вы можете столкнуться.Загрузите изображение в фоновом потоке, а затем вызовите другой метод в основном потоке (из фонового потока), чтобы фактически обновить UIImageView

performSelectorOnMainThread:...

Что касается проблемы с неработающим методом, попробуйте это вместо:

[self performSelectorInBackground:@selector(setImage2:) withObject:nil];

(добавление двоеточия после setImage2).

Кроме того, я не думаю, что эти два объекта NSThread (t1 и t2) необходимы, и они также, вероятно, создаютутечка памяти.

3 голосов
/ 05 ноября 2010

Технически, NSThread само по себе не создает цикл выполнения автоматически, тогда performSelector:onThread не будет работать, если вы просто создадите поток таким образом.

...