ivar выпускается под ARC - как мне сохранить его для использования в другом методе?
Я боролся с чем-то в течение нескольких недель, и это остановило мой прогресс. Я задавал вопрос несколько раз о SO, люди были полезны, но никто не понял, что я делаю неправильно. Это кажется довольно простой вещью, так что, надеюсь, у кого-нибудь там будет момент с лампочкой и он решит это. Я реализую TWRequest, результат возвращается в словарь, я перебираю результаты, чтобы извлечь часть твита и создаю массив этих "текстовых" компонентов. Прямо через цикл, я указываю журнал массива - _twitterText, и он печатается нормально. Сразу после завершения этого метода кажется, что _twitterText сбрасывается. Я создал его в своем файле.h как сильное свойство и создал ivar в viewdidload. Все еще нет радости. Как мне сохранить этот массив для использования в другом методе? Вот мой файл.h....
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import "CustomCell.h"
#import "AppDelegate.h"
#import <Twitter/Twitter.h>
@interface MyViewController : UITableViewController <CLLocationManagerDelegate>
{
CLLocationManager *here;
}
@property(strong) NSDictionary *dict;
@property(strong) CLLocationManager *here;
@property (strong, nonatomic) NSMutableArray *twitterText;
- (void)fetchTweets;
@end </p>
Вот мой файл реализации.m......
#import "MyViewController.h"
@interface MyViewController ()
@end
@implementation MyViewController
@synthesize dict;
@synthesize twitterText = _twitterText;
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
_twitterText = [[NSMutableArray alloc] init];
here = [[CLLocationManager alloc] init];
here.delegate = self;
[here startUpdatingLocation];
AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];
NSLog(@"phrase carried over is %@", delegate.a);
[self fetchTweets];
}
- (void)fetchTweets
{
TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:
@"http://search.twitter.com/search.json?q=%40wimbledon"]
parameters:nil requestMethod:TWRequestMethodGET];
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
{
if ([urlResponse statusCode] == 200)
{
// The response from Twitter is in JSON format
// Move the response into a dictionary and print
NSError *error;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
//NSLog(@"Twitter response: %@", dict);
NSArray *results = [dict objectForKey:@"results"];
//Loop through the results
for (NSDictionary *tweet in results) {
// Get the tweet
NSString *twittext = [tweet objectForKey:@"text"];
// Save the tweet to the twitterText array
[_twitterText addObject:twittext];
}
NSLog(@"MY ************************TWITTERTEXT************** %@", _twitterText);
}
else
NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]);
}];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
// Return the number of rows in the section.
return 5;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MyCell";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
//cell.venueDetails.text = [_twitterText objectAtIndex:indexPath.row];
NSLog(@"MY ************************OTHER BIT THAT WONT PRINT************** %@", _twitterText);
return cell;
}
1 ответ
Итак, проблема в том, что ваш обработчик завершения, который вы передаете -[TWTweet performRequestWithHandler:]
не будет (не может) срабатывать, пока не будет установлено сетевое соединение и сервер не ответит на ваш запрос. Это может занять сотни миллисекунд или даже секунд. (Или это может никогда не произойти).
Между тем, пока это происходит, UITableView хочет нарисовать себя и поэтому спросит вас, сколько у вас разделов / строк, а затем попросит ячейку для каждой строки. Поэтому, когда запрашивается табличное представление, вы должны вернуть фактическое количество строк, которые вы должны нарисовать за это время:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [self.twitterText count]; // the actual number of rows we have right now
}
Итак, следующий шаг, который вам нужен, это перезагрузить таблицу, когда ваши данные фактически поступают с сервера. Это побудит ваше табличное представление снова запросить количество разделов и строк, а затем запросить ячейки для каждого раздела и строки. Итак, где-то в вашем блоке завершения после обработки всех ваших данных вам нужно будет сделать это:
dispatch_async(dispatch_get_main_queue(), ^{
// you'll need an outlet to the UITableView
// here I assume you call that 'tableView'
// then just ask it to reload on the main thread
[self.tableView reloadData];
});
Надеюсь, это поможет?