Jsonデータ取得時にNSDictionaryにNSNullがきた時の対処

2015.03.23 Monday 00:53
0
    Web APIを使ってJsonを取得するコードを書いていました。

    JSON → NSDictionaryと変換して、JSONデータを取得する方法を使っていたのですが、サーバ側のDBにNULLが入っているなどの理由でNSDictionaryに変換した時に値がNSNullになってしまうことがありました。


    swiftで下記のようにNSDictionaryから値を取得しようと思ったら、NSNullの時に落ちてしまいます。

    keyValue = dictionary["MyKey"] as Int!

    そのため、事前にNSNullかどうかのチェックするコードを追加してみました。


    var urlString = "http://hoge.com/?my_api_value=1"
    var url = NSURL(string: urlString)
    
    var task = NSURLSession.sharedSession().dataTaskWithURL(url!, 
                completionHandler:{data, response, error in
        if (data != nil) {
            var dictionary = NSJSONSerialization.JSONObjectWithData(data, options:
            NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
    
            var keyValue: Int!
            if (dictionary["MyKey"]?.isKindOfClass(NSNull) == true){
                keyValue = -1
            } else {
                keyValue = dictionary["MyKey"] as Int!
            }
        }
    })
    
    task.resume()
    


    ネットでググっても、見当たらなかったのでブログに残しておきます。

    もしかして、みなさん、別の方法で回避しているのかな???
    他に良い方法があったら教えてください。

    category:通信関連 | by:こもcomments(0) | - | -

    ブログのRSS情報を読み込んでみた

    2013.06.27 Thursday 00:00
    0
      Web APIなどを使ったiPhoneアプリを作ってみたいと思い、XMLファイルの読み込みにチャレンジしてみました。

      手始めに、このブログのRSS情報を読み込んで、ブログのタイトルを取得するコードを書いてみました。



      XMLを解析するにはNSXMLParserDelegateというインターフェースが用意されている見たいです。

      UIViewControllerを継承すると処理が煩雑になりそうっだったので、とりあえずNSObjectを継承してクラスを作ってみました。


      @interface BlogSearchUtil : NSObject <NSXMLParserDelegate>
      {
          BOOL isItemTag;
          BOOL isTitleTag;
          NSString *workTitleStr;
          NSMutableArray *titleList;
      }
      
      - (id)init;
      - (void)dealloc;
      
      - (BOOL)requestXml: (NSString *) urlstr;
      @end
      


      #import "BlogSearchUtil.h"
      
      @implementation BlogSearchUtil
      
      - (id)init
      {
          if(self == [super init]) {
              titleList = [NSMutableArray array];
          }
      	
          return self;
      }
      
      - (void)dealloc
      {
          [titleList removeAllObjects];    
      }
      
      
      - (BOOL)requestXml:
          (NSString *) urlstr
      {
          // とりあえずURL固定
          NSURL *url = [NSURL URLWithString:@"http://ios.steppers-hi.net/?mode=rss"];
          NSURLRequest *request = [NSURLRequest requestWithURL:url];
          NSOperationQueue *queue = [[NSOperationQueue alloc] init];
          
          [NSURLConnection sendAsynchronousRequest:request queue:queue 
                  completionHandler:^(NSURLResponse *res, NSData *data, NSError *error) {
              
              if(error) {
                  NSLog(@"%@", error);
              }
              
              // 取得したXMLをパース
              NSXMLParser* parser = [[NSXMLParser alloc] initWithData:data];
              [parser setDelegate:self];
              [parser parse];
              
          }];
          
          return(YES);
      }
      
      // XMLのパース開始
      - (void)parserDidStartDocument:(NSXMLParser *)parser
      {
          
          isItemTag = NO;
          isTitleTag = NO;
          workTitleStr = @"";
      }
      
      // XMLのパース終了
      - (void)parserDidEndDocument:(NSXMLParser *)parser
      {
      
          for (NSString *status in titleList) {
      		NSLog(@"%@", status);
          }
      }
      
      // 開始タグを読み込み
      - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
              namespaceURI:(NSString *)namespaceURI
              qualifiedName:(NSString *)qualifiedName
              attributes:(NSDictionary *)attributeDict
      {
          
      	if([elementName isEqualToString:@"item"]) {
      		isItemTag = YES;
      	} else if([elementName isEqualToString:@"title"]) {
      		isTitleTag = YES;
              workTitleStr = @"";
      	}
      }
      
      // 終了タグを読み込み
      - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
              namespaceURI:(NSString *)namespaceURI
              qualifiedName:(NSString *)qName
      {
          
      	if([elementName isEqualToString:@"item"]) {
      		isItemTag = NO;
      	} else if([elementName isEqualToString:@"title"]) {
      		isTitleTag = NO;
              [titleList addObject:workTitleStr];
              
      	}
      }
      
      // テキストデータ読み込み
      - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
      {
      
      	if(isItemTag && isTitleTag) {
              workTitleStr = [workTitleStr stringByAppendingString:string];
      	}
      }
      
      


      [実行結果の出力]

      A device with number 'UDIDxxxxxxxx' already exists on this team
      日本語Urlを含むWebページの開き方
      webサイトを呼び出してみる
      iOS7のベータ版を入れてみた
      NSMutableArrayにてオブジェクトを並び替える
      ViewControllerで画面遷移のデータ受け渡し
      アニメーションを指定して次の画面を呼び出す
      NSStringを使った文字列の配列
      Objective-Cの文字列・数値変換
      次の画面のxibを呼び出して移動する
      ブログ始めました



      はまったのはfoundCharactersです。

      一つのエレメントのデータのはずなのに、何度もコールされることがありました。
      そのため、引数のstringをstringByAppendingStringでテキストを繋ぐということをしました。


      エラー処理などは全然未着手ですが、とりあえずRSSを取得・解析するところまではできました。
      もう少し形を整えて実装したいものですね(^^;;
      category:通信関連 | by:こもcomments(0) | - | -

      日本語Urlを含むWebページの開き方

      2013.06.17 Monday 13:28
      0
        昨日の続きで、Web周りの処理を書いてました。

        日本語のURLを含むサイトが開けずに困ったので、備忘録として残しておきます。

            // wikiのURLを作成
            NSString *searchWord = @"アプリ";
            NSString *urlString = [NSString stringWithFormat:@"http://ja.wikipedia.org/wiki/%@", 
                                                searchWord];
        
            // ブラウザで開く
            NSURL *url = [NSURL URLWithString:urlString];
            if(url == nil){
                NSLog(@"NSURL is nil");
            } else {
                [[UIApplication sharedApplication] openURL:url];
            }
        

        NSURLの作成に失敗してnilが返ってきてブラウザは起動しませんでした。

        日本語をURL用にエンコードしないといけないみたいですね(^^;;


            // wikiのURLを作成
            NSString *searchWord = @"アプリ";
            NSString *urlString = [NSString stringWithFormat:@"http://ja.wikipedia.org/wiki/%@", 
                                        searchWord];
        
            // ブラウザで開く
            NSURL *url = [NSURL URLWithString:
                    [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
            if(url == nil){
                NSLog(@"NSURL is nil");
            } else {
                [[UIApplication sharedApplication] openURL:url];
            }
        

        これでなんとか日本語をエンコードして、目的のWebサイトが開けるようになりました。
        category:通信関連 | by:こもcomments(0) | - | -

        webサイトを呼び出してみる

        2013.06.17 Monday 02:02
        0
          アプリ内からWebサイトを呼び出す方法を模索してみました。


          最初に試したのは、ブラウザアプリを呼び出す方法です。

              urlString = @"http://ios.steppers-hi.net/";
              url = [NSURL URLWithString:urlString];
          
              [[UIApplication sharedApplication] openURL:url];
          


          意外と簡単に書けてびっくりしました。


          しかし、問題点が……。

          ブラウザアプリを呼び出してしまうと、自分のアプリに戻って来られないのです(T_T)

          ……僕がiPhoneアプリ開発に慣れていないだけで、何かいい方法があるのでしょうかね???
          とりあえず分からないので、この方法は断念しました(^^;;


          続いて、WebViewを使う方法を試してみました。

          UIViewControllerを継承して、WebViewと戻るボタンのついた画面を作ってみました。


          - (void)viewDidLoad
          {
              [super viewDidLoad];
          
              _webcview.delegate = self;
          
              urlString = @"http://ios.steppers-hi.net/";
              NSURL *url = [NSURL URLWithString:urlString];
              NSURLRequest *req = [NSURLRequest requestWithURL:url];
              [_webcview loadRequest:req];
          }
          
          
          -(void)webViewDidStartLoad:(UIWebView*)webView{
              [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
          }
          
          -(void)webViewDidFinishLoad:(UIWebView*)webView{
              [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
          }
          


          こちらも少ないコードで実装できました。


          でも、画面の見た目がもう一つよくないんですよねー(^^;;

          何かいい方法ないですかねー???
          category:通信関連 | by:こもcomments(0) | - | -

          Calender
          1234567
          891011121314
          15161718192021
          22232425262728
          293031    
          << October 2017 >>
          Sponsored Link
          Selected entry
          Category
          Archives
          Recent comment
          • NSUnknownKeyExceptionが出た時の回避方法
            itotake
          • 画面を縦方向に固定にする
            iphone 画面 固定
          • NSUnknownKeyExceptionが出た時の回避方法
          • NSUnknownKeyExceptionが出た時の回避方法
            atsushi
          • NSUnknownKeyExceptionが出た時の回避方法
            kanejun
          • UITableViewCellに置いたボタンのイベント処理
            こも
          • UITableViewCellに置いたボタンのイベント処理
            かつお
          • NSUnknownKeyExceptionが出た時の回避方法
            こも
          • NSUnknownKeyExceptionが出た時の回避方法
             
          • iOS7のベータ版を入れてみた
            こも
          Sponsored Link
          Link
          Profile
          Search
          Others
          Mobile
          qrcode
          Powered
          無料ブログ作成サービス JUGEM