ios geocodeAddressString изменить глобальную переменную во время блока

Я понимаю, что вызов CLGeocoder geocodeAddressString является асинхронным, с переданным блоком для обработки обратного вызова во время завершения. Я также понимаю, что единственные переменные, которые могут быть изменены внутри блока, — это локальные переменные __block. Но мне нужно сохранить полученные CLPlacemarks в глобальной переменной NSMutableArray, и я не могу понять, как это может произойти. Доступ к любым переменным __block возможен только в рамках одного и того же метода, но в тот момент, когда они имеют какое-либо значение (т.е. внутри блока), я не могу присвоить какое-либо значение глобальному массиву. После блока переменные __block, скорее всего, не будут иметь никакого значения из-за немедленного возврата при вызове асинхронной строки geocodeAddressString.

Как я могу сохранить результаты вызова, чтобы их можно было использовать для обновления UITableView?


person bobsmells    schedule 05.10.2012    source источник


Ответы (1)


Хорошо, решено. Я неправильно сделал вывод (из моего чтения о блоках), что свойства и переменные экземпляра не могут быть изменены в рамках блока. В моем случае причина, по которой я не мог изменить свой массив iVar, заключалась в том, что я не выделил/инициалировал его. Как только я это сделал, я смог присвоить значения и увидеть их за пределами блока, например. в моем методе cellForRowAtIndexPath моего табличного представления.

Приношу свои извинения всем, кто мог быть введен в заблуждение моими первоначальными предположениями! Для справки, я думаю, что текст в документах Apple касается блоков и переменных здесь немного вводит в заблуждение... единственные переменные, которые он упоминает как изменяемые, - это переменные функционального уровня __block, тогда как он говорит, что все остальные "могут быть доступны", которые я взял как означающее «только для чтения» (я знаю, что и геттеры, и сеттеры являются аксессорами, но контекст был запутанным).

person bobsmells    schedule 05.10.2012
comment
Вы всегда обращаетесь (т.е. читаете значение) к переменной указателя объекта, чтобы отправить сообщение или получить доступ к полям объекта, на который он указывает. Изменение переменной означает присваивание ей. - person newacct; 06.10.2012