iOS 6 - Мое приложение задерживается, когда распознается жест, и UIActivityIndicator не показывает. Что мне нужно сделать?

Я добавил распознаватель жестов (два пальца), который обнаруживает, когда пользователь нажимает на изображение в UIWebView и вызывает UIActivityViewController для сохранения изображения и других вещей. Моя проблема заключается в том, что когда я нажимаю на изображение, есть задержка (в зависимости от того, насколько велика величина изображения), и то, что я пытаюсь добиться, заключается в том, что, когда пользователь дважды нажимает на изображение, я хочу показать индикатор активности, пока изображение готово к сохранению и т. д. Я могу добавить, что проблема здесь: imageToBeSaved = [UIImage imageWithData: [NSData dataWithContentsOfURL: url]]; после того, как я вынимаю этот код, больше нет отставания. Вот мой код:

// adding gesture recognizer to "website" (which is a "UIWebView")
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
doubleTap.numberOfTouchesRequired = 2;
[website addGestureRecognizer:doubleTap];

// actions on gesture detect and call actionsOnImage for options
-(void) doubleTap :(UITapGestureRecognizer*) sender {
[loadingImageActivityIndicator startAnimating];
int scrollPositionY = [[self.website stringByEvaluatingJavaScriptFromString:@"window.pageYOffset"] intValue];
int scrollPositionX = [[self.website stringByEvaluatingJavaScriptFromString:@"window.pageXOffset"] intValue];

int displayWidth = [[self.website stringByEvaluatingJavaScriptFromString:@"window.outerWidth"] intValue];
CGFloat scale = website.frame.size.width/displayWidth;

CGPoint pt = [sender locationInView:self.website];
pt.x *= scale;
pt.y *= scale;
pt.x += scrollPositionX;
pt.y += scrollPositionY;

NSString *js = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).tagName", pt.x, pt.y];
NSString *tagName = [self.website stringByEvaluatingJavaScriptFromString:js];

if ([tagName compare:@"IMG" options:NSCaseInsensitiveSearch]==NSOrderedSame) {
    NSLog(@"tagName was IMG");
    NSString *imgURL = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).src", pt.x, pt.y];
    NSString *urlToSave = [self.website stringByEvaluatingJavaScriptFromString:imgURL];
    NSURL *url = [NSURL URLWithString:urlToSave];
    imageToBeSaved = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
    [website addSubview:loadingImageActivityIndicator];

    [self actionsOnImage]; //self made function with sharing capabilities (see below)
}

}

- (void) actionsOnImage {
[loadingImageActivityIndicator stopAnimating];

NSArray* dataToShare = [[NSArray alloc] initWithObjects:imageToBeSaved, nil];
UIActivityViewController* activityViewController =
[[UIActivityViewController alloc] initWithActivityItems:dataToShare
                                  applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:^{}];
}
0
nl ja de

1 ответы

Выполняйте загрузку изображения асинхронно. Измените порядок строк следующим образом.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
     imageToBeSaved = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
     [self actionsOnImage];
});

[website addSubview:loadingImageActivityIndicator];
1
добавлено
Самый простой способ понять - прочитать о очередях отправки. " developer.apple.com/library/ios/# documentation/General/& hellip; позволяет делать что-то параллельно. Кроме того, если вы не используете параллельное программирование, вся работа выполняется поочередно, одна строка за другой. Это то, что происходило в вашем случае. Изображение загружалось, затем указывался индикатор активности, а затем метод его отмены. То, чего вы ожидали, не происходило. Если вы используете приведенные выше конструкции, это помогает.
добавлено автор Srikanth, источник
Yay ... спасибо :) если вы не возражаете, можете ли вы объяснить, что это делает? Я всегда видел это на других постах, но понятия не имею, что он делает.
добавлено автор Sero Eskandaryan, источник
Большое вам спасибо за разъяснение :)
добавлено автор Sero Eskandaryan, источник
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 и т.д.