2015-01-23 3 views
1

웹 서비스에서 데이터를로드하고 배열을 채울 메서드가 있습니다. 제대로 작동합니다 ("get_data"라고 부름). 나는이 배열 ("arr")을 피커 뷰 ("pv")의 데이터 소스로 사용하며, 내 app를 실행할 때 pickerview가 항목들로 가득 차있다. 어느 날 나는 "활동 지시자"("ai")를 사용하기로 결정했다. 그리고 지금 "pv"는 항상 비어 있으며, 그것을 고치는 방법을 모른다. 다음은 내 코드입니다.pickerview에 데이터를 채우고 동시에 활동 표시기를 실행하는 방법은 무엇입니까?

- (void) viewDidLoad { 
[super viewDidLoad]; 
[ai startAnimation]; // ACTIVITY INDICATOR STARTS SPINNING. 
[self performSelector:@selector(get_data) // FILL ARRAY. 
      withObject:nil 
      afterDelay:0]; } 
//------------------------------------------------------------------- 
- (void) get_data { // CALL WEB SERVICE, FILL ARRAY WITH JSON DATA. 
[ai stopAnimation]; } // SPINNING STOPS AFTER LONG TASK. 
//------------------------------------------------------------------- 
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
return 1; } 
//------------------------------------------------------------------- 
- (NSInteger)pickerView :(UIPickerView *)pickerView 
numberOfRowsInComponent:(NSInteger)component { 
return [arr count]; } 
//------------------------------------------------------------------- 
- (NSString *)pickerView:(UIPickerView *)pickerView 
      titleForRow:(NSInteger)row 
      forComponent:(NSInteger)component { 
return [arr objectAtIndex:row]; } 
//------------------------------------------------------------------- 
- (void) pickerView:(UIPickerView *)pickerView 
     didSelectRow:(NSInteger)row 
     inComponent:(NSInteger)component { 
index = [pv selectedRowInComponent:0]; } // INDEX IS A GLOBAL INT. 
//------------------------------------------------------------------- 
- (NSAttributedString *) pickerView:(UIPickerView *)pickerView 
       attributedTitleForRow:(NSInteger)row 
         forComponent:(NSInteger)component { 
NSString * title = [arr objectAtIndex:row]; 
NSAttributedString * attString = [[NSAttributedString alloc] 
           initWithString:title attributes: 
           @{NSForegroundColorAttributeName: 
           [UIColor blackColor]}]; 
return attString; } 

"performSelector"로 "활동 표시기"를 사용했으며 정상적으로 작동했습니다. 필자가 이해할 수없는 것은 pickerview 메소드가 배열과 함께 더 이상 작동하지 않는 이유입니다. 따라서 제 질문은 pickerview에 데이터를 채우고 동시에 활동 표시기를 실행하는 방법입니다.

I이, pickerview 작품처럼 내의 viewDidLoad을 변경할 수 있지만 작동 표시등이 켜지지 않는 경우 : 당신이 performSelector:를 사용할 때 당신은 단순히 직접 선택이라고했던 것처럼

- (void) viewDidLoad { 
[super viewDidLoad]; 
/* [ai startAnimation]; // ACTIVITY INDICATOR STARTS SPINNING. 
[self performSelector:@selector(get_data) // FILL ARRAY. 
      withObject:nil 
      afterDelay:0]; */ 
[self get_data]; 
} 
+0

피커 데이터 소스 방법에 중단 점을 두어 웹 서비스가 완료되고 활동 표시기가 중지 된 후 적중 여부를 확인하십시오. 그리고'arr'에는 여러분이 생각하는 객체가 포함되어 있는지 확인하십시오. – Stonz2

+0

친애하는 Stonz2 님, 당신이 제안한대로했는데 arr이 데이터로 가득차 있지만 pickerview 메서드가 전혀 실행되지 않습니다. –

답변

2

, 그것은 동일한 스레드에서 실행됩니다. 웹 서비스가 다른 스레드 또는 블록에서 실행하는 경우

- (void) viewDidLoad { 
    [super viewDidLoad]; 
    [ai startAnimation]; // ACTIVITY INDICATOR STARTS SPINNING. 
    // CALL WEB SERVICE, FILL ARRAY WITH JSON DATA. 
    [ai stopAnimation]; // SPINNING STOPS AFTER LONG TASK. 
} 

당신이 연결할 수 있습니다 :

- (void) viewDidLoad { 
    [super viewDidLoad]; 
    [ai startAnimation]; // ACTIVITY INDICATOR STARTS SPINNING. 
    [self get_data]; // FILL ARRAY. 
} 

하거나 :

- (void) viewDidLoad { 
    [super viewDidLoad]; 
    [ai startAnimation]; // ACTIVITY INDICATOR STARTS SPINNING. 
    [self performSelector:@selector(get_data) // FILL ARRAY. 
      withObject:nil 
      afterDelay:0]; 
} 

- (void) get_data { 
    // CALL WEB SERVICE, FILL ARRAY WITH JSON DATA. 
    [ai stopAnimation]; // SPINNING STOPS AFTER LONG TASK. 
} 

은 동일 완료 응답자 인 경우 [ai stopAnimation];을 입력해야합니다.

메인 스레드 (은 메인 스레드에서 네트워크 작업을 차단하지 않습니다.)에서 데이터를 동 기적으로 웹 서비스로 호출하는 경우 대신 모든 스레드를 백그라운드 스레드 :

- (void) viewDidLoad { 
    [super viewDidLoad]; 
    [ai startAnimation]; // ACTIVITY INDICATOR STARTS SPINNING. 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0L), ^{ 
    // CALL WEB SERVICE, FILL ARRAY WITH JSON DATA. 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    [ai stopAnimations]; // SPINNING STOPS AFTER LONG TASK. 
    }); 
}); 
+0

방금 ​​코드를 시도했지만 pickerview가 여전히 비어 있고 활동 표시기가 회전하지 않지만 배열에 데이터가 가득 찼습니다. 나는 Stonz2가 sugested 한 것을했는데, "numberOfComponentsInPickerView"에 중단 점을 넣었고 pickerview 메서드가 실행되었지만 중단 점이 없으면 실행되지 않습니다. 이것은 정말로 나를 괴롭 히고있다. –

+0

감사합니다, 이안, Stonz2의 도움을 받아 실제로 대답했습니다. I –

+0

죄송합니다. 댓글을 편집하는 데 5 분 제한을 초과했습니다. 방금 창을 전환했는데 댓글이 전송되었습니다. 댓글입니다. stonz2에서 "reloadAllComponents"를 가져 와서 이안 코드의 "stopAnimations"앞에 넣으면 이제 이안 코드가 작동합니다. 나는 두 가지 모두에 포인트를 줄 것이고 이안의 대답은 올바른 것이다. 고마워, 친구. –

1

이 피커 뷰의이 dataSourcedelegate가 설정되어 있는지 확인합니다. 웹 서비스가 완료된 후 업데이트 된 arr으로 선택기의 데이터 소스를 다시로드해야합니다.

+0

아무 것도 작동하지 않는 것 같습니다. performSelector를 제거하면 pickerview가 완벽하게 작동하므로 pickerview 메서드가 작동하지 않게 만드는 performSelector 및 수명주기에 대해 뭔가가 있습니다. –

+0

Stanz2에서 "reloadAllComponents"를 가져 와서 Ian의 코드 "stopAnimations"앞에 넣었습니다. 이제 Ian의 코드가 작동합니다. 나는 두 가지 모두에 포인트를 줄 것이고 이안의 대답은 올바른 것이다. 고마워, 친구. –

관련 문제