Я пытаюсь заставить performSelector загружать индикатор активности в отдельный поток во время вызова веб-службы. Проблема заключается в «возврате parsedData»; не устанавливается в fetchJSON :. Однако, когда я печатаю parsedData в методе getData:, он возвращается в порядке. Я предполагаю, что возврат выполняется до того, как executeSelector завершит получение данных. Есть ли способ, чтобы метод fetchJSON: дождался выполнения функции PerformSelector перед возвратом parsedData?проблема с использованием performSelector для ActivityIndicator при вызове веб-службы - IOS
-(void)showActivityIndicator
{
CGRect frame = CGRectMake(0.0, 0.0, 125.0, 125.0);
loading = [[UIActivityIndicatorView alloc] initWithFrame:frame];
[loading setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
[loading hidesWhenStopped];
//loading.center=[self tableView].center;
[loading startAnimating];
[loading sizeToFit];
loading.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleBottomMargin);
// initing the bar button
//UIBarButtonItem *loadingView = [[UIBarButtonItem alloc] initWithCustomView:loading];
//loadingView.target = self;
[loadingView addSubview:loading];
}
- (NSDictionary *)fetchJSON:(NSString *)urlString
{
NSMutableString *domain = [[NSMutableString alloc] initWithString:@"http://www.blablabla.com/dev/"];
[domain appendString:urlString];
//NSLog(@"%@", domain);
NSURL *url = [NSURL URLWithString:domain];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
[self showActivityIndicator];
[self performSelector:@selector(getData:) withObject:req afterDelay:0.0];
//[self performSelectorOnMainThread:@selector(getData:) withObject:req waitUntilDone:YES];
return parsedData;
}
-(IBAction)getData:(id)sender
{
NSURLResponse* response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:sender returningResponse:&response error:nil];
parsedData = [NSJSONSerialization
JSONObjectWithData:data
options:NSJSONReadingMutableLeaves
error:nil];
NSLog(@"GET DATA %@", parsedData);
[loading stopAnimating];
loading = nil;
}
Извините, все эти методы находятся в моем классе WebService. Другие классы создают экземпляр этого класса и передают строку пути URL-адреса для fetchJSON и получают данные моего веб-сервиса. Это отлично работает для моего приложения, пока я не решил включить индикатор активности (так как время загрузки может занять некоторое время). это действительно был кошмар, и ближе всего я получил это, реализуя его таким образом. многие другие методы, которые я использовал, заставили бы индикатор вращаться ПОСЛЕ загрузки веб-службы (что никогда не имело для меня смысла, пока кто-то не объяснил, что он должен быть в отдельном потоке). –
btw, loadView - это переменная, которая настроена на представление, на которое я хочу показать загрузочное колесо. поэтому, если класс A необходим для создания переменной WebService, он будет создавать экземпляр объекта, а затем передать представление A в init, для которого установлено значение «loadView». –