spinner не отображается при загрузке uimageview из URL-адреса IOS

При переходе с одного вида на другой, я хочу, чтобы во втором представлении отображалось изображение, чтобы увидеть счетчик (так что второе представление откроется мгновенно, не потребуется никакого времени, и пользователь ждет, пока счетчик будет Конец).

Вот мой код:

Во втором представлении открывается тот, который открывается:

- (void)viewDidLoad
{
    [super viewDidLoad];
   //Do any additional setup after loading the view.

    UIActivityIndicatorView *spinner=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.center=CGPointMake(160.0,240.0 );
    spinner.hidesWhenStopped=YES;
    [self.view addSubview:spinner];
    [spinner startAnimating];

NSString *urlString=[NSString stringWithFormat:@"http://mysite.com/projects/test/test.jpg"];

    NSLog(@"URL is:%@",urlString);
    NSURL *url=[NSURL URLWithString:urlString];
    [more_info_image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:url]]];

    [spinner stopAnimating];
}

Я не вижу прядильщика вообще. я не думаю, что это потому, что мое подключение к интернету настолько толстое. С другой стороны, я вижу небольшую задержку при нажатии кнопки и ожидании открытия представления - как будто это тот момент, когда он пытается загрузить изображение.

Я хочу открыть представление, иметь счетчик, загрузить изображение, а затем позволить прядильщику уйти.

Я должен что-то изменить?

1
nl ja de

4 ответы

Возможно, вы не видите UIActivityIndicatorView , поскольку в основном потоке вы используете [NSData dataWithContentsOfURL: url] . Это блокирует основной поток от отображения UIActivityIndicatorView до тех пор, пока изображение не будет загружено, и к тому моменту вы его удалите.

Возможно, вы захотите сделать что-то вроде:

но убедитесь, что вы определили spinner в вашем файле *. h , чтобы это работало.

- (void)viewDidLoad
{
   ...

   //This code will make downloadImage run in the background thread
   [self performSelectorInBackground:@(downloadImage) withObject:nil]

   ...
}

- (void) downloadImage{
    NSLog(@"URL is:%@",urlString);
    NSURL *url=[NSURL URLWithString:urlString];
    UIImage *downloadedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];

    //This code will make setImage run in the main thread since it is changing UI
    [more_info_image performSelectorOnMainThread:@selector(setImage:) withObject:downloadedImage waitUntilDone:NO];
    //This code will make stopAnimating run in the main thread since it is changing UI
    [spinner performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO];

}

Другой способ - использовать Grand Central Dispatch и сделайте что-нибудь вроде:

- (void)viewDidLoad
{

    [super viewDidLoad];
   //Do any additional setup after loading the view.

    UIActivityIndicatorView *spinner=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.center=CGPointMake(160.0,240.0 );
    spinner.hidesWhenStopped=YES;
    [self.view addSubview:spinner];
    [spinner startAnimating];

    //This is the new GCD code
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
    dispatch_async(queue, ^{
        //This code will run on a background thread
        NSString *urlString=[NSString stringWithFormat:@"http://mysite.com/projects/test/test.jpg"];

        NSLog(@"URL is:%@",urlString);
        NSURL *url=[NSURL URLWithString:urlString];
        UIImage *downloadedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];

        dispatch_sync(dispatch_get_main_queue(), ^{
            //this code runs on the main thread since it is UI changes
            [more_info_image setImage:downloadedImage];

            [spinner stopAnimating];
        });
    });
}
5
добавлено
Я получаю эту ошибку в downloadImage definition: Инициализация UIIMAge с несовместимым типом void
добавлено автор ghostrider, источник
Да, я понял это. Позвольте мне проверить это, и тогда я приму ваш ответ.
добавлено автор ghostrider, источник
да извини. Сделал исправление. Это должно быть UIImage * loadedImage = [UIImage imageWithData: [NSData dataWithContentsOfURL: url]]; not UIImage * loadedImage = [more_info_image setImage: [UIImage imageWithData: [NSData dataWithContentsOfURL: url]]]; как это было.
добавлено автор Joe, источник

Когда вы загружаете свое изображение в методе viewDidLoad, поэтому, пока изображение загружается, оно не загружает ваше представление, поэтому вы испытываете задержку. Попробуйте это

в файле заголовка добавьте экземпляр UIActivityIndicator

UIActivityIndicator *spinner;

в вашем файле реализации сделайте что-то вроде этого

- (void)viewDidLoad
{
    [super viewDidLoad];
   //Do any additional setup after loading the view.

    spinner=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.center=CGPointMake(160.0,240.0 );
    spinner.hidesWhenStopped=YES;
    [self.view addSubview:spinner];
    [spinner startAnimating];
    [self performSelector:@selector(downloadYourImageMethod) withObject:nil afterDelay:1];
}

-(void)downloadYourImageMethod
{
    NSString *urlString=[NSString stringWithFormat:@"http://mysite.com/projects/test/test.jpg"];
    NSURL *url=[NSURL URLWithString:urlString];
    [myIMageview setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:url]]];

    [spinner stopAnimating];
}
2
добавлено

измените свой код как

    - (void)viewDidLoad
{
    [super viewDidLoad];
   //Do any additional setup after loading the view.

    UIActivityIndicatorView *spinner=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.center=CGPointMake(160.0,240.0 );
    spinner.hidesWhenStopped=YES;
    [self.view addSubview:spinner];
    [spinner startAnimating];
     [self performSelector:@selector(downloadImage) withObject:nil afterDelay:0.1];
}


-(void)downloadImage
{
NSString *urlString=[NSString stringWithFormat:@"http://mysite.com/projects/test/test.jpg"];

    NSLog(@"URL is:%@",urlString);
    NSURL *url=[NSURL URLWithString:urlString];
    [more_info_image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:url]]];

    [spinner stopAnimating];
}
1
добавлено
Это фактически не делает ничего по-другому и не решает проблему блокировки основного потока.
добавлено автор Mick MacCallum, источник
Вы можете дать тегу UIActivityIndicatorView для доступа к нему в методе downloadImage, или вы можете определить UIActivityIndicatorView * spinner в файле .h, чтобы сделать его переменной класса.
добавлено автор ask4asif, источник

Иногда все зависит от того, как вы размещаете свои взгляды. Счетчик должен сделать последнее, что добавлено в иерархию, чтобы быть первым в том порядке, в котором загружается ваш просмотр. Это было в моем случае, я надеюсь, что это поможет кому-то еще, кто сталкивается с этим ответом. :)

0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.