MGTwitterEngine и его поддерживаемые массивы - PullRequest
0 голосов
/ 29 мая 2011

Это мой первый пост.Я боялся что-то публиковать, так как я новичок в C ++, но я должен сказать, что мне кажется, что я довольно быстро освоился, так как я опытный разработчик html, css, javascript.

Хорошо, я в порядке.работая над этим проектом, который реализует Twitter и Matts TwitterEngine, и все начинает сходиться.У меня есть табличное представление, собирающее временную шкалу пользователя, который входит в систему. Вы можете создавать твиты и видеть временную шкалу, но у меня возникают некоторые проблемы при попытке включить атрибут "@" user ".

У меня естьпришли к выводу, что это потому, что это NSDictionary с несколькими массивами внутри самого себя. Например, @user состоит из User, scree_name, ect, так что вот некоторый код, чтобы посмотреть, может ли кто-нибудь помочь мне разобраться в этом немного.

В файле .h NSObject я буду вызывать

-(NSString*)author;

В файле .m

 @implementation Tweet

 -(id)initWithTweetDictionary:(NSDictionary*)_contents {

if(self == [super init]) {

    contents = _contents;
    [contents retain];
}

return self;
}

-(NSString*)author {

return [[contents objectForKey:@"user"] objectForKey:@"screen_name"];
}

Теперь я обращаюсь к немуПосмотрите и верьте, что у меня есть проблемы, потому что я все еще изучаю массивы и изменяемые массивы и не знаю, что вызывать.

В моем TwitterViewController.h я сначала, очевидно, импортирую SA_OAuth-движок и контроллер, которые работают нормально, затем я использую два MutableArrays, такие какниже

  MGTwitterEngine *_twitter;
  SA_OAuthTwitterEngine *_engine;
  NSMutableArray *tweets;
  NSMutableArray *authors;

в twitterview.m Я импортирую первый .h, а затем вызываю

 //Connect to twitter API
- (void)viewDidAppear:(BOOL)animated {

    if(_engine) return;

    _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate:self];
    _engine.consumerKey = @"key here =P";
    _engine.consumerSecret = @"secret here =P";

    UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];

    if (controller) 
        [self presentModalViewController: controller animated: YES];
    else {
        tweets = [[NSMutableArray alloc] init];
        authors = [[NSMutableArray alloc] init];

Затем я возвращаю счет того МуtableArray и попытайтесь отобразить его рядом с твитами, чтобы он отображал экранное имя лиц реального твита на временной шкале

    - (UITableViewCell *)tableView:(UITableView *)tableView      cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *identifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) {

  //add subtitle
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle     reuseIdentifier:@"cell"];

    }

    [cell.textLabel setNumberOfLines:7];
    [cell.textLabel setText:[(Tweet*)[tweets objectAtIndex:indexPath.row] tweet]];
    //-------THIS IS WHERE I KEEP GETTING A SIGBRT DURING LOAD "dump saying return count 0-----------[cell.textLabel setText:[(Tweet*)[authors objectAtIndex:indexPath.row] author]];------

   //[cell.detailTextLabel setText:[(Tweet*)[retweetCount objectAtIndex:indexPath.row]      reTweetCount]];




#pragma mark SA_OAuthTwitterController Delegate

- (void) OAuthTwitterController: (SA_OAuthTwitterController *) controller authenticatedWithUsername: (NSString *) username {

    NSLog(@"Authenticated with user %@", username);

    tweets = [[NSMutableArray alloc] init];
    authors =[[NSMutableArray alloc] init];

    [self updateStream:nil];
}





- (void)statusesReceived:(NSArray *)statuses forRequest:(NSString *)connectionIdentifier {

    tweets = [[NSMutableArray alloc] init];

    for(NSDictionary *d in statuses) {

        NSLog(@"See dictionary: %@", d);

        Tweet *tweet = [[Tweet alloc] initWithTweetDictionary:d];
        [tweets addObject:tweet];
        [retweetCount addObject:tweet];
        [tweet release];
    }

    [self.tableView reloadData];
}


- (void)userInfoReceived:(NSArray *)userInfo forRequest:(NSString *)connectionIdentifier {


    authors = [[NSMutableArray alloc] init];

    for (NSDictionary *d in userInfo) {


    NSLog(@"See dictionary: %@", d);


        Tweet *tweet = [[Tweet alloc] initWithTweetDictionary:d];
        [authors addObject:tweet];
        [tweet release];

    }

    [self.tableView reloadData];


}

Так, как я уже сказал, «твиты» работают, и я могу добавить другие объекты с помощьюМетод addObject, такой как счетчик ретвитов, но я не могу понять, почему я не могу получить отображаемое имя пользователя в ячейке !!!

Я также в конечном итоге хочу Async с аватарами и добавить кнопку RT, так что если у кого-нибудь есть какие-либо предложения по ЛЕГКОМУ способу реализации тех, которые были бы также хороши!

Я ценю любую помощь, которую могу получить !!!Спасибо, надеюсь услышать от кого-нибудь в скором времени, чтобы помочь мне рассказать о NSDictionary, NSArrays и MutableArrays, потому что я считаю, что именно в этом и заключается проблема.Или, может быть, я просто не заполняю таблицу правильно, каким бы человеком я ни оказался, я могу помочь!

Искренне спасибо

Энтони

DUMP:

2011-05-29 03:27:21.477 ThemeCatcher[10409:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x01524be9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x016795c2 objc_exception_throw + 47
    2   CoreFoundation                      0x0151a6e5 -[__NSArrayM objectAtIndex:] + 261
    3   ThemeCatcher                        0x00024498 -[TwitterVeiwController tableView:cellForRowAtIndexPath:] + 600
    4   UIKit                               0x008037fa -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 634
    5   UIKit                               0x007f977f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
    6   UIKit                               0x0080e450 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
    7   UIKit                               0x00806538 -[UITableView layoutSubviews] + 242
    8   QuartzCore                          0x004a8451 -[CALayer layoutSublayers] + 181
    9   QuartzCore                          0x004a817c CALayerLayoutIfNeeded + 220
    10  QuartzCore                          0x004a137c _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
    11  QuartzCore                          0x004a10d0 _ZN2CA11Transaction6commitEv + 292
    12  QuartzCore                          0x004d17d5 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99
    13  CoreFoundation                      0x01505fbb __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
    14  CoreFoundation                      0x0149b0e7 __CFRunLoopDoObservers + 295
    15  CoreFoundation                      0x01463bd7 __CFRunLoopRun + 1575
    16  CoreFoundation                      0x01463240 CFRunLoopRunSpecific + 208
    17  CoreFoundation                      0x01463161 CFRunLoopRunInMode + 97
    18  GraphicsServices                    0x01f42268 GSEventRunModal + 217
    19  GraphicsServices                    0x01f4232d GSEventRun + 115
    20  UIKit                               0x0079e42e UIApplicationMain + 1160
    21  ThemeCatcher                        0x00002c29 main + 121
    22  ThemeCatcher                        0x00002ba5 start + 53
    23  ???                                 0x00000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'
Current language:  auto; currently objective-c
(gdb)     

ОБНОВЛЕНО !!!!!!Хотите опубликовать мое решение, если другие читают это.Я ненавижу просматривать посты, и пользователи находят своего пользователя, но не делятся своим решением, чтобы помочь другим в будущем.Так что я не стану этим парнем и не расскажу всем, как я заставил это работать!

Решение:

Сначала Правильно вызывайте свои массивы, как говорит Дэнни ниже. НЕ следуйте тому методу, которым я был, это может стать проблемой для вас позже в будущем.«Я все еще использовал MutableArray для обоих вызовов, но попытаюсь измениться в ближайшем будущем.

Теперь убедитесь, что все массивы отформатированы правильно, и« соедините ваши точки »= P. Но вот Kicker! Ниже приведена частьMGTwitterEngine, который объясняет мою проблему. Сначала я вызывал целое число «1», которое, по мнению движка, я пытался получить по одному «screen_name» для целого массива пользователей, поэтому очевидно, что это будет SIGABRT и сказать, что WTH вы пытаетесьделать здесь! = P

Просто хочу уточнить, что я говорил ранее о целых числах и определении пользователя. В

MGTwitterRequestTypes.h towards the bottom theres this line of code:typedef enum _     



MGTwitterResponseType {
MGTwitterStatuses           = 0,    // one or more statuses
MGTwitterStatus             = 1,    // exactly one status
MGTwitterUsers              = 2,    // one or more user's information
MGTwitterUser               = 3,    // info for exactly one user
MGTwitterDirectMessages     = 4,    // one or more direct messages
MGTwitterDirectMessage      = 5,    // exactly one direct message
MGTwitterGeneric            = 6,    // a generic response not requiring parsing
MGTwitterMiscellaneous      = 8,    // a miscellaneous response of key-value      pairs
MGTwitterImage              = 7,    // an image
 #if YAJL_AVAILABLE
MGTwitterSearchResults      = 9,    // search results
#endif
 }    MGTwitterResponseType;

// Этот ключ добавляется к каждому возвращенному твиту или прямому сообщению, // со значением NSNumber, содержащим MGTwitterRequestType. // Это разработано, чтобы помочь клиентским приложениям агрегировать обновления.

определить TWITTER_SOURCE_REQUEST_TYPE @ "source_api_request_type"

Я надеюсь, что помогу другим выполнитьдобавив scree_name ... и в основном вы можете использовать это для любой "текстовой" информации внутри там, такойкак ReTweet рассчитывает на ...Теперь мне нужно выяснить, как загрузить изображения их профиля в табличном виде .... У меня есть загрузка изображений с этой строкой кода, но по какой-то странной причине он не загружается в табличное представление.Он даже корректно выдвигает текст, как будто это изображение, но там нет ни одного

Любые предложения по этому поводу будут с благодарностью !!!

NSString *imageurl = [avatarsURL objectAtIndex:0]; 
 NSLog(@"http://api.twitter.com/1/users/profile_image/username.json");   
NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL   URLWithString:imageurl]]; 
UIImage *tableImage = [[UIImage alloc] initWithData:imageData]; 

[cell.imageView setImage:tableImage]; 
CGSize imageSize = CGSizeMake(45,40);   
UIGraphicsBeginImageContext(imageSize); 
CGRect imageRect = CGRectMake(0.2, 0.1, imageSize.width, imageSize.height); 
[tableImage drawInRect:imageRect]; 
cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext();    

.... Я получаюнет никаких ошибок, только это в дампе "Я должен удалить ГиперСсылки, потому что проблемы со спамом, и я новый участник .... К вашему сведению"

2011-05-29 17:26:02.950 ThemeCatcher[2974:207]    

http:api.twitter.com/1/users/profile_image/username.json
2011-05-29 17:26:02.980 ThemeCatcher[2974:207]   

http:api.twitter.com/1/users/profile_image/username.json
2011-05-29 17:26:02.981 ThemeCatcher[2974:207]   
http:api.twitter.com/1/users/profile_image/username.json

2011-05-29 17:26:02.982 ThemeCatcher[2974:207]   
http:api.twitter.com/1/users/profile_image/username.json
2011-05-29 17:26:02.983 ThemeCatcher[2974:207]   
http:api.twitter.com/1/users/profile_image/username.json
2011-05-29 17:26:02.984 ThemeCatcher[2974:207]     
http:api.twitter.com/1/users/profile_image/username.json
2011-05-29 17:26:02.985 ThemeCatcher[2974:207]      
http://api.twitter.com/1/users/profile_image/username.json
2011-05-29 17:26:02.987 ThemeCatcher[2974:207]   
http://api.twitter.com/1/users/profile_image/username.json
2011-05-29 17:26:06.550 ThemeCatcher[2974:207] Request Suceeded: BF0E18DB-A2CC-4823-AC02-   
6E182127BBF7

Я могу оставить 2 = P

1 Ответ

0 голосов
/ 29 мая 2011

Хорошо, есть несколько проблем (напоследок я сохраню информацию, связанную с управлением памятью):

Общие проблемы

Прежде всего, как выглядит ваша реализация numberOfSectionsInTableView: и tableView:numberOfRowsInSection:?

Далее, каждый раз, когда вызывается ваш viewDidAppear: и вы уже вошли в систему, вы в основном забываете обо всех старых твиттах: tweets = [[NSMutableArray alloc] init];

Но что еще более проблематично, так это то, что вы делаете это каждый раз, когда получаете данные:

- (void)statusesReceived:(NSArray *)statuses forRequest:(NSString *)connectionIdentifier {

    tweets = [[NSMutableArray alloc] init]; // <= No!
    ...
}

И еще есть проблема, которую я не понимаю, потому что я не знаю библиотеку: в чем разница между вашим authors и вами tweets? (Оба массива твитов - честно говоря, я не вижу смысла.)

Если вы правильно поняли ваш сбой, это происходит, когда вы пытаетесь получить твит из массива authors, и вы предполагаете , что в вашем массиве авторов есть как минимум то же количество объектов, что и в массиве. tweets массив. Я не очень хорошо знаю MGTwitterEngine, но, исходя из его документации, userInfoReceived:forRequest: будет вызываться только после того, как вы отправите явный запрос на профиль пользователя.
Поэтому неудивительно, что ваше предположение, по-видимому, неверно.

Кроме того, вы должны иметь возможность получать всю информацию, необходимую для отображения твита на временной шкале, от самого твита (ну, кроме фактических данных изображения аватара, то есть).

Управление памятью

Вы пропускаете каждый твит, который когда-либо будете получать:

Несмотря на то, что вы заботитесь о правильном освобождении каждого отдельного твита после добавления его в массив tweets или authors (хорошо), вы забываете об этих массивах всякий раз, когда поступают новые данные. Вероятно, вам не следует заменять полноту в первую очередь, говорит о массивах и - вместо этого - просто добавляет к ним новый материал, но, поскольку вы решили пойти по этому пути, обязательно освободите старый массив, прежде чем назначить новый.

Лично я бы предложил другой подход и создал бы массив tweets только один раз в initWithStyle: (и вообще не стал создавать массив authors), добавляя и удаляя из него по мере необходимости. - правильно утилизировать его в dealloc и вызывать removeAllObjects для него, когда пользователь выходит из системы (если в этом случае вы не избавляетесь от контроллера представления полностью).

...