我有一个iOS应用程序,可以下载并解析Twitter JSON提要,然后在UITableView中显示该提要。这一切都很好,但我有一个问题:
当用户点击UITableView单元格时,应用程序会查看数组“tweets_links”并查看该特定推文是否有附加网址,如果有,则会显示网页视图。
因为并非所有的推文都有网站网址,所以我添加了一个简单的try catch语句(比如在C ++中),它可以告诉我在尝试访问数组的这一部分时是否存在异常。
我的问题是:这是做坏的好方法吗?
这是我的代码:
int storyIndex = indexPath.row;
int url_test = 1;
NSString *url;
@try {
url = [[tweets_links[storyIndex] valueForKey:@"url"] objectAtIndex:0];
}
@catch (NSException *problem) {
// There is NO URL to access for this Tweet. Therefore we get the out of bounds error.
// We will NOT take the user to the web browser page.
// Uncomment the line below if you wish to see the out of bounds exception.
// NSLog(@"%@", problem);
url_test = 0;
}
if (url_test == 1) {
WebBrowser *screen = [[WebBrowser alloc] initWithNibName:nil bundle:nil];
self.seconddata = screen;
seconddata.web_url = url;
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:screen animated:YES completion:nil];
}
else if (url_test == 0) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Info" message:@"There is no URL attatched to this Tweet." delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
[alertView show];
[tweetTableView deselectRowAtIndexPath:indexPath animated:YES];
}
有没有更好的方法来尝试实现我正在做的事情?
谢谢,Dan。
答案 0 :(得分:5)
使用try和catch是不鼓励Objective-C有其他方法检查和处理错误
// firstObject will return the first object in the array or nil if the array is empty.
url = [[tweets_links[storyIndex][@"url"]] firstObject];
if (!url) {
// handle the case for no url
} else {
// do something with url
}
由于在Objective-C中向nil
发送消息是安全的并且返回nil
,因此链接调用是安全的。例如如果字典没有该键的对象,则它将返回nil
并将firstObject
发送到nil
返回nil
。
答案 1 :(得分:1)
如果以下方法可以正常使用,因为TRY CATCH用于捕获编程错误 并使用 的 objectForKey:强> 代替 的 valueForKey 强>:
if ([tweets_links[storyIndex] objectForKey:@"url"] != nil)
OR
if ([url isKindOfClass:[NSString class]])
{
// Code handling the URL
}
else
{
// Code handling there is no URL
}
答案 2 :(得分:0)
我对Twitter提要不是很了解,但您可以查看nil
返回的objectForKey:
值,如此
if ([tweets_links[storyIndex] objectForKey:@"url"] != nil) { /* process the URL */ }
您的代码假设该值始终是至少size = 1的数组,在假设它是一个数组之前检查@“url”键的值会更安全。
答案 3 :(得分:0)
使用Objective-C中的异常。例外保留用于编程错误。您没有捕获它们,您修复了代码。使用JSON文档,您永远不会保证收到的内容,所以请小心。
NSString* url = nil;
NSArray* linksArray = nil;
NSDictionary* linkDict = nil;
NSArray* urlArray = nil;
if ([tweet_links isKindOfClass:[NSArray class]])
linksArray = tweet_links;
if (storyIndex >= 0 && storyIndex < linksArray.count)
linkDict = linksArray [storyIndex];
urlArray = linkDict [@"url"];
if ([urlArray isKindOfClass:[NSArray class]] && urlArray.count > 0)
url = urlArray [0];
if ([url isKindOfClass:[NSString class]])
{
// Code handling the URL
}
else
{
// Code handling there is no URL
}
请注意,将消息发送到nil对象始终会返回0 / NO / nil。
请养成正确命名变量的习惯。你写了“int url_test = 1;”。 url_test是什么意思?我读了变量名,我不知道它的含义。我需要了解所有代码。使它成为“int”意味着它可能是0,1,2,20000或其他什么。如果你改写“BOOL urlValid = YES;”很明显:这意味着你有一个有效的URL。
答案 4 :(得分:0)
由于url值是一个NSString值,你可以使用length
检查它是否为零,如果没有,是否有任何值(非空字符串)。您可以检查此NSString是否是有效的URL。
- (BOOL) validateUrl: (NSString *) candidate {
NSString *urlRegEx = @"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx];
return [urlTest evaluateWithObject:candidate];
}
...
NSString *url = [[tweets_links[storyIndex][@"url"]] firstObject];
if ([url length] && [self validateUrl: url]) {
// Has a valid URL
}