2011-12-04 40 views
10

Cụ thể, vấn đề này đã đến với tôi khi tôi đưa ra yêu cầu AFNeworking với JSONkit và nhận một JSON (id) với một số mảng và từ điển được lồng vào nhau.Cách tiếp cận tốt nhất để chuyển đổi các đối tượng bất biến thành các đối tượng có thể thay đổi (đệ quy) là gì?

Nếu tôi không muốn thay đổi các dữ liệu, tôi không có bất kỳ vấn đề:

self.myNSArray = [JSON objectForKey:@"result"];

Nhưng nếu tôi muốn sửa đổi dữ liệu tôi phải để lưu trữ nó trong một biến có thể thay đổi:

self.myNSMutableArray = [[JSON objectForKey:@"result"] mutableCopy];

Người cuối cùng không chuyển đổi mảng lồng nhau hoặc từ điển để dữ liệu có thể thay đổi; nó chỉ hoạt động ở cấp độ đầu tiên.

Cách duy nhất mà tôi đã tìm thấy là trên liên kết này recursive mutable objects; nhưng tôi không biết liệu có cách nào tốt nhất để giải quyết vấn đề này không.

Xin cảm ơn trước.

Trả lời

11

Bạn có thể sử dụng chức năng CoreFoundation CFPropertyListCreateDeepCopy với các tùy chọn mutability kCFPropertyListMutableContainersAndLeaves:

NSArray *immutableArray = [JSON objectForKey:@"result"]; 
self.myMutableArray = [(NSMutableArray *)CFPropertyListCreateDeepCopy(NULL, immutableArray, kCFPropertyListMutableContainersAndLeaves) autorelease]; 
+0

Nó hoạt động như một sự quyến rũ. Cảm ơn! – martinezdelariva

+2

Tương đương ARC có vẻ là 'CFBridgingRelease (CFPropertyListCreateDeepCopy (NULL, (__bridge CFPropertyListRef) (immutableArray), kCFPropertyListMutableContainersAndLeaves)); ' – brainjam

+1

@omz Nếu điều này làm việc cho từ điển, bạn có biết không? Có vẻ như không làm cho nó chuyển đổi. –

5

On ARC:

CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL, (__bridge CFPropertyListRef)(immutableArray), kCFPropertyListMutableContainersAndLeaves)) 

thực sự làm việc. Cảm ơn brainjam.

+0

Dường như nó có tác dụng với tôi. Cảm ơn! – cbh2000

0

Đảm bảo bạn đang chăm sóc các giá trị null trong chuỗi phản hồi, nếu không nó sẽ trả lại cho bạn không gây ra kết quả khủng khiếp.

(Đối với Ví dụ. Hãy thử mutataing phản hồi từ http://www.json-generator.com/api/json/get/bQVoMjeJOW?indent=1)

Chỉ cần đặt phía dưới đường khi chuyển đổi đáp ứng API để JSON Object.

responseString=[responseString stringByReplacingOccurrencesOfString:@"\":null" withString:@"\":\"\""];//To Handle Null Characters 

//Search for below line in your parsing library and paste above code 
data = [responseString dataUsingEncoding:NSUTF8StringEncoding]; 

Vì vậy, sẽ không có ký tự null trong đối tượng JSON của bạn, do đó không có vấn đề gì khi sử dụng CFPropertyListCreateDeepCopy.

Chúc mừng !!

Các vấn đề liên quan