2013-04-25 37 views
1

我想從API加載數據並顯示它在UITableView內。我使用AFNetworking進行網絡通話,但現在我面臨一個問題:我無法在成功塊內訪問myTableViewselfios:更新內部AFNetworking成功回調內的UITableView

@property (weak, nonatomic) IBOutlet UITableView *myTableView; 
@property (nonatomic,retain) NSMutableArray *myDataSource; 

@synthesize featuredProductsTableView; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NetworkManager *networkManager = [NetworkManager getInstance]; 
    myDataSource = [NSMutableArray array]; 

    [networkManager getPath:@"example.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id JSON) { 
     [myDataSource addObjectsFromArray:JSON]; 

     [myTableView reloadData]; 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"%@",error); 
    }]; 
} 

調試代碼示出了塊內我不能訪問任何的selfmyDataSource,或myTableView

我該如何解決這個問題?

謝謝。

+4

要訪問myDataSource你應該__block myDataSource = [NSMutableArray的陣列]使用; ,self和myTableView必須可訪問 – 2013-04-25 14:24:24

+0

變量在一個塊內部訪問而不用__block聲明前綴是一個實變量的副本 – 2013-04-25 14:26:04

+0

我將它改爲@property(nonatomic,retain)__block NSMutableArray * myDataSource;仍然無法訪問它們中的任何一個 – trrrrrrm 2013-04-25 14:35:34

回答

0

你應該使用:

__block myDataSource = [NSMutableArray array]; 

您還可以閱讀:

What does the "__block" keyword mean?

+0

這是完全錯誤的。首先,'__block'只能應用於局部變量。 'myDataSource'是一個實例變量。其次,即使它是一個局部變量,「__block」只有在變量被賦值時纔有用。除了在塊之前初始化之外,沒有其他變量分配給其他變量。 – newacct 2013-04-25 23:46:21

+0

在downvoting之前閱讀問題和意見,因爲您看到問題已編輯 – 2013-04-26 06:48:35

+0

'myDataSource'是原始版本中的一個實例變量 – newacct 2013-04-26 07:03:19

-2

聲明此就在您的塊之前:

__block typeof(self) this = self; 

至少,這將允許您從塊內達到self,通過調用它this

編輯:這不是要走的路,我的錯誤。見How do I avoid capturing self in blocks when implementing an API?

+0

這完全錯了。當然,您可以從塊內部訪問「self」。 – newacct 2013-04-25 23:47:31

+0

那麼爲什麼靜態分析器會抱怨,如果我在(某些)塊中使用'self',可能會導致保留週期?所以我試圖教我自己,發現這個:http://stackoverflow.com/questions/7853915/how-do-i-avoid-capturing-self-in-blocks-when-implementing-an-api – Cyrille 2013-04-26 06:46:50

+0

它可能導致一個保留週期,但這並不意味着你不能這樣做 – newacct 2013-04-26 07:03:59