0

JSONModelを使用して単純な Web サービスからデータを取得しています。キーの値を@"message"可変配列に取得する必要があります。

 - (void)viewDidLoad
{
     [super viewDidLoad];
     self.delegate = self;
     self.dataSource = self;

     NSString *conversationid = @"xx";
     NSString *callURL = [NSString stringWithFormat:@"http://mydomain.com/inbox_messages.php?conversation=%@", conversationid];

     _feed = [[MessageFeed alloc] initFromURLWithString:callURL
            completion:^(JSONModel *model, JSONModelError *err)
     {
          self.messages = [[NSMutableArray alloc]initWithObjects:[_feed.messagesinconversation valueForKey:@"message"], nil];
          NSLog(@"messages %@", self.messages);
     }];
     NSLog(@"test %@", self.messages);
}

私が経験している問題は、 while:NSLog(@"messages %@", self.messages);がすべての適切なデータをNSLog(@"test %@", self.messages);返し、 (null).

変数は、クラスの .h で次のように宣言されています。@property (strong, nonatomic) NSMutableArray *messages;

これはおそらく初心者の質問ですが、私は初心者であり、誰かが正しい方向への指針を与えてくれれば、とても幸せです.

4

2 に答える 2

1

self.messages の NSLog が完了ブロックの外にあります。完了ブロックは、データがロードされた後に呼び出されます。ログは、MessageFeed リクエストを作成した直後に呼び出されます。したがって、もちろん、リクエストが完了していないため、オブジェクト self.messages は null です。

これに対する解決策は、完了ブロック内ですべての解析を処理するか、別のクラス メソッドを呼び出して受信したデータを解析することです。

于 2013-09-16T22:35:42.927 に答える
0

NSLog("test %@", self.messages); の後に完了ハンドラが呼び出されています。は。

通常、ブロックは同時に発生し、ここでの完了ハンドラーや場合によってはエラー ハンドラーのような特定のイベントが発生したときに発生します。コードを見ると、おそらく次のようなものが得られます。

テスト nil メッセージ

したがって、MessageFeed オブジェクトは実行されていますが、コードを続行し、最初に完了ハンドラー スコープ外で NSLog を実行します。JSON オブジェクトがダウンロードされた後、それが解析され、完了ハンドラが実行されます。

 - (void)viewDidLoad
{
[super viewDidLoad];
self.delegate = self;
self.dataSource = self;

NSString *conversationid = @"xx";
NSString *callURL = [NSString stringWithFormat:@"http://mydomain.com/inbox_messages.php?conversation=%@", conversationid];

_feed = [[MessageFeed alloc] initFromURLWithString:callURL //this method takes some time to complete and is handled on a different thread.
            completion:^(JSONModel *model, JSONModelError *err)
         {
             self.messages = [[NSMutableArray alloc]initWithObjects:[_feed.messagesinconversation valueForKey:@"message"], nil];
             NSLog(@"messages %@", self.messages); // this is called last in your code and your messages has been has been set as an iVar.
         }];
  NSLog(@"test %@", self.messages); // this logging is called immediately after initFromURLWithString is passed thus it will return nothing
 }
于 2013-09-16T22:37:22.760 に答える