2012-03-29 7 views
1

Я очень новичок в iOS и объектно-ориентированной разработке, поэтому я борюсь с пониманием того, как я это делаю.Доступ к NSMutableArray изнутри для цикла

Первый мой код:

-(NSMutableArray *)messagesGetList 
{ 

NSMutableArray *messageList = [[NSMutableArray alloc] init]; 

NSURL *url = [NSURL URLWithString:@"http://xxxx/"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
            {  
             for (NSDictionary * dataDict in JSON) { 

              [messageList addObject: dataDict]; 

             }            
            } 
            failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON) 
            { 
             NSLog(@"Failed: %@", error);   

            }]; 

[operation start]; 


return messageList; 
} 

Что я имею проблему с, в том, что я не могу получить доступ к NSMutableArray * messageList внутри моей для (NSDictionary * dataDict в формате JSON) петли. I.e. при выполнении моего цикла ничего не добавляется в массив.

Как получить доступ к массиву из моего цикла?

Заранее спасибо за вашу помощь, Фишера

+0

Добавить 'NSLog (@" loop ");' прямо над вашей линией 'addObject'. Убедитесь, что вы вообще находитесь в цикле. – Justin808

+0

Возможно, вы хотите зарегистрировать объект JSON (или просто установить точку останова и проверить в отладчике), чтобы убедиться, что вы возвращаете массив. –

+0

Это в цикле два раза .. И loggin JSON возвращает красиво отформатированный массив! Спасибо за ваши предложения, хотя! – fischer

ответ

3

Поскольку +JSONRequestOperationWithRequest: принимает блоки, которые будут вызваны в случае успеха и неудачи, это хорошее предположение, что этот метод работает асинхронно. Итак, если вы проверите массив, который сразу возвращается из вашего -messagesGetList, он, вероятно, будет пустым. Если вы подождете некоторое время перед проверкой, вы можете увидеть, как оно заполняется.

+0

Я вообще об этом не думал .. Это очень хороший момент. Я проверю, так ли это: – fischer

+1

@fischer: В частности, я думаю, вы хотите сделать '[operation waitUntilFinished]'. Но учтите, что это заблокирует ваше приложение до завершения операции (запрет запуска вашего собственного цикла запуска). Вы бы, наверное, лучше не пытались заставить это быть синхронным. – Chuck

3

Я думаю, вам нужно добавить модификатор __block хранения данных на NSMutableArray переменный, для того, чтобы быть изменяемыми в ответ блока.

__block NSMutableArray *messageList = [[NSMutableArray alloc] init]; 
+0

Я попробовал добавить модификатор __block. К сожалению, я не имел никакого значения. Я предполагаю, что проблема может быть в том, что предложил Калеб. Я вообще об этом не думал! Но все равно спасибо! Большая помощь :) – fischer

+0

Думая об этом немного больше, код не собирается изменять 'messageList', он собирается изменить изменчивый массив, на который ссылается' messageList'. Поэтому '__block', вероятно, здесь не помогает. – Caleb

+1

Нет, это не имеет значения. Дефицит '__block' необходим только в том случае, если вы изменяете _pointer_ (т. Е. Переписываете новый объект). Вы можете отправлять сообщения в изменяемый объект внутри блока целый день без проблем./cc @Caleb –

0

Вы должны передать объект-делегат этому методу и отправить сообщение делегату после завершения сетевого запроса. Это лучшая практика на платформе iOS.

Смежные вопросы