0

我正在使用AFNetworking庫從服務器提取JSON訂閱源以填充UIPickerView,但我在處理異步方式時遇到了一些麻煩。 @propertyclassChoices是用於填充UIPickerViewNSArray,因此網絡通話僅執行一次。但是,由於該塊在實例變量返回時尚未完成,因此getter返回nil,並最終導致我的程序稍後崩潰。任何幫助解決這個問題將不勝感激。如果您需要任何其他信息,請告知我。AFNetworking異步數據提取

PickerViewController.m classChoices消氣

- (NSArray *)classChoices { 
    if (!_classChoices) { 
     // self.brain here refers to code for the SignUpPickerBrain below 
     [self.brain classChoicesForSignUpWithBlock:^(NSArray *classChoices) { 
      _classChoices = classChoices; 
     }]; 
    } 
    return _classChoices; 
} 

SignUpPickerBrain.m

- (NSArray *)classChoicesForSignUpWithBlock:(void (^)(NSArray *classChoices))block { 
    [[UloopAPIClient sharedClient] getPath:@"mobClass.php" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseJSON) { 
     NSLog(responseJSON); 
     if (block) { 
      block(responseJSON); 
     } 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 

     if (block) { 
      block(nil); 
     } 
    }]; 
} 

回答

2

你需要一個像你PickerViewController一旦被下載返回數組下面的方法。一旦回調已被返回,您可以繼續使用您的代碼:

- (void)classChoices:(void (^) (NSArray * classChoices)) _callback { 
    if (!self.classChoices) { 
     // self.brain here refers to code for the SignUpPickerBrain below 
     [self.brain classChoicesForSignUpWithBlock:^(NSArray *classChoices) { 
      _callback(classChoices); 
     }]; 
    } 
} 

// call the method 

- (void) viewDidLoad { 

    [super viewDidLoad]; 

    [self classChoices:^(NSArray * updatedChoices) { 

     self.classChoices = updatedChoices; 

     [self.pickerView reloadAllComponents]; 

    }]; 

} 
+0

也許我之前並不清楚,但'classChoices'是一個'@ property';上面的代碼是重寫它的getter。另外,這已經是一個回調'SignUpPickerBrain'。在回調中放置一個回調似乎有點過於複雜,對吧?你說什麼會在_callback裏完成? – sethfri

+0

在回調中放置回調很好,並不是特別複雜。無需重寫getter,只需將'classChoices'作爲標準的NSMutableArray,然後在需要更新數組時調用-classChoices(帶回調 - 我的代碼如上所示)。數組的更新將發生在_callback內部。我會更新答案以包含此代碼。 –

+0

我編輯了代碼以使其與編譯器一致,但代碼仍然不起作用。該程序仍然崩潰,出現錯誤:線程1:EXC_BAD_ACCESS(代碼= 2,地址= 0x16)'。 – sethfri