MGTwitterEngine及其支持的数组

时间:2011-05-29 07:47:20

标签: iphone uitableview nsmutablearray nsarray mgtwitterengine

这是我第一次发帖。我一直害怕发布任何东西,因为我是一个C ++菜鸟但是我不得不说我似乎很快就会抓住,因为我是一个经验丰富的html,css,javascript开发者。

好的,我正在开发这个实现twitter和Matts TwitterEngine的项目,事情开始变得更加紧密。我有一个tableview收集登录用户的时间表。你可以发推文并查看时间表,但我在尝试合并“@”用户“属性时遇到了一些问题。

我得出的结论是,它是一个NSDictionary,里面有几个数组。例如@user由User,scree_name,ect组成,所以这里有一些代码可能会看到是否有人可以帮助我解决这个问题。

在NSObject的.h文件中,我将调出一个

-(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"];
}

现在这就是我把它称为View的地方,并且相信我有问题,因为我仍然在学习数组和可变数组而不确定要调用什么。

在我的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];

然后我返回MutableArray的计数并尝试在推文旁边显示它,以便在时间轴上显示实际推文的人员screen_name

    - (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按钮,这样如果有人对EASY方式有任何建议,那么实现那些也会很棒!

我感谢任何帮助!感谢希望很快听到一些人帮助启发我关于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)     

已更新!!!!!!想要发布我的解决方案,其他人阅读此内容。我讨厌浏览帖子和用户找到他们的awnser,但不分享他们的解决方案,以帮助其他人在未来。所以我不会那个人告诉你我是如何让这个工作的!

解决方案:

首先正确地调出你的阵列,就像丹尼谈到下面的那样,不要按照我可能会在以后引起问题的方法。 “我仍然在两次通话中使用MutableArray,但会在不久的将来尝试改变。

现在确保所有阵列格式正确并“连接你的点”= P. 但这里是踢球者!以下是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;

//此密钥被添加到每条推文或返回的直接消息中, //包含MGTwitterRequestType的NSNumber值。 //这旨在帮助客户端应用程序聚合更新。

定义TWITTER_SOURCE_REQUEST_TYPE @“source_api_request_type”

我希望我能帮助其他人完成添加scree_name ...并且基本上你可以使用它来获取其中的任何“文本”信息,例如ReTweet Counts等...等等... 现在我需要弄清楚如何在tableview中加载他们的配置文件图像....我有它用这行代码加载图像但它不会在表视图中加载由于一些奇怪的原因。它甚至可以正确推送文本,就像它们是那里的图像一样,但没有一个

对此的任何建议都将非常感谢!!!

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();    

....我在转储中完全没有错误“我必须删除HyperLinks,因为垃圾邮件问题,我是新成员.... FYI”

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 :(得分:0)

好的,有一些问题(我将最后保存与内存管理相关的内容):

一般问题

首先,您对numberOfSectionsInTableView:tableView:numberOfRowsInSection:的实施情况如何?

接下来,每次调用viewDidAppear:并且您已经登录时,您基本上都会忘记所有旧推文:tweets = [[NSMutableArray alloc] init];

但更有问题的是,每次收到数据时都会这样做:

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

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

然后出现这个问题,我不明白,因为我不知道图书馆:你的authorstweets之间有什么区别? (两者都是推文数组 - 坦率地说,我不明白这一点。)

如果您正确理解了崩溃,当您尝试从authors数组中检索推文并且假设您的作者数组中至少包含相同数量的对象时,就会发生这种情况,作为tweets数组。 我不太了解MGTwitterEngine,但根据我在其文档中推断的内容,只有在您为用户个人资料发送显式请求后才会调用userInfoReceived:forRequest:。 因此,您的假设显然是错误的,这并不奇怪。

此外,您应该能够获得在推文本身的时间线中显示推文所需的所有信息(除了化身的实际图像数据之外)。

内存管理

您正在泄露您将收到的每条推文:

虽然在将每个推文添加到tweetsauthors数组(好)之后你会正确地发布每个推文,但是每当有新数据进入时你都会忘记这些数组。你可能不应该首先替换整个所说的数组,而不是简单地将新的东西添加到它们中,但是既然你决定走这条路线,请确保在分配新数组之前释放它。

就个人而言,我建议采用不同的方法并在tweets中仅创建一次initWithStyle:数组(并且根本不打算创建authors数组)只添加到并根据需要从中删除 - 当用户注销时(如果你没有完全丢弃视图控制器,在这种情况下),在dealloc中正确处理它并在其上调用removeAllObjects