0

Я пытаюсь заставить 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; 
} 

ответ

0

"performSelector загрузить индикатор активности на отдельном потоке"

??

UIKit, в общем, не является потокобезопасным.

Между прокомментированным кодом и запутанными декларациями методов (почему getData: IBAction? Он называется как изнутри кода, так и в качестве действия элемента управления?), Мне действительно не хватает контекста того, что вы пытаетесь сделать здесь ,

Не могли бы вы начать с простого обзора того, что вы пытаетесь выполнить, и того, как этот код вписывается в эту картинку?

+0

Извините, все эти методы находятся в моем классе WebService. Другие классы создают экземпляр этого класса и передают строку пути URL-адреса для fetchJSON и получают данные моего веб-сервиса. Это отлично работает для моего приложения, пока я не решил включить индикатор активности (так как время загрузки может занять некоторое время). это действительно был кошмар, и ближе всего я получил это, реализуя его таким образом. многие другие методы, которые я использовал, заставили бы индикатор вращаться ПОСЛЕ загрузки веб-службы (что никогда не имело для меня смысла, пока кто-то не объяснил, что он должен быть в отдельном потоке). –

+0

btw, loadView - это переменная, которая настроена на представление, на которое я хочу показать загрузочное колесо. поэтому, если класс A необходим для создания переменной WebService, он будет создавать экземпляр объекта, а затем передать представление A в init, для которого установлено значение «loadView». –

 Смежные вопросы

  • Нет связанных вопросов^_^