2011-11-07 35 views
8

Tôi biết câu hỏi này đã được hỏi vài lần, nhưng tôi hơi khác một chút. Trước khi đóng tài khoản này là trùng lặp, vui lòng đọc kỹ. Có rất nhiều bài viết trên ngăn xếp tràn mà nói, "Cá nhân, tôi ghét MACROS, Đừng sử dụng shit". Tôi đã đọc tất cả những điều đó và trường hợp của tôi khác. Tôi đang cố gắng xác định URL được sử dụng trong phần mềm (ứng dụng iOS) bằng cách sử dụng # macro xác định.#define hoặc const string *

Tôi đồng ý rằng việc sử dụng chuỗi ký tự là một phương pháp hay hơn # macro xác định. Nhưng trong thế giới API dựa trên REST ngày càng chấp nhận các tham số truy vấn như một phần của URL, làm thế nào bạn vẫn có thể sử dụng các chuỗi const để biểu diễn một URL thay đổi?

Thay vì http://api.myblog.com/posts?entryid=%@ Server API mà nguyên tắc REST sau đây sẽ có http://api.blog.com/posts/entries/[entryid]

Trong kiểu cũ, URL là http://api.myblog.com/posts cho tất cả các mục và họ không thay đổi. Một chuỗi const là có thể.

Trong loại sau, thay đổi URL với mỗi mục nhập và tôi sử dụng Macro mở rộng đến URL đầy đủ như thế này.

#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__]; 

Có lỗi thiết kế nào trong phương pháp của tôi không? Muốn biết thông tin đầu vào của bạn.

Cảm ơn.

Trả lời

4

Nhìn từ góc nhìn của trình biên dịch, #define là một chỉ thị tiền xử lý (tham khảo định nghĩa trong c, http://en.wikipedia.org/wiki/C_preprocessor).

Trong trường hợp này, trình biên dịch có thể đang thực hiện thay thế toàn bộ văn bản trước khi biên dịch mã của bạn.

ví dụ .: nếu bạn xác định:

#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__]; 

nó có thể được thay thế mỗi lần xuất hiện của GET_ENTRY_URL (x) với [NSString ..., x] trong mã của bạn. Có khả năng, các cá thể có thể được tạo ra ở mọi nơi chúng ta sử dụng macro nếu việc thực hiện mục tiêu-c đang theo dõi điều này.

const/biến tĩnh có vẻ là một cách tốt hơn.

+0

Làm thế nào để bạn vượt qua biến trong nsstrings const tĩnh? – Mugunth

+1

bạn biết bạn không thể, vì nó là một hằng số. imho, nếu api trở nên phức tạp hơn, tôi sẽ xây dựng lớp như một NSURL, xây dựng url có thể được thực hiện bên trong. có lẽ nó không phải là quan trọng chưa sử dụng vĩ mô hay không, nhưng khi đoạn mã này được nhiều nơi, mọi thứ có thể cảm thấy sai một lần nữa. ví dụ: chia tất cả GET_ENTRY_URL (x) thành hai GET_CODING_ENTRY_URL (x), GET_PERSONAL_ENTRY_URL (x). – alvinsj

2

Những gì tôi đã làm trong ứng dụng của tôi là xác định một const cho đường dẫn cơ sở và một const cho từng đường dẫn cụ thể với mã định dạng thay thế bên trong đường dẫn khi cần.

NSString const *APIBasePath  = @"http://api.mydomain.com"; 
NSString const *APIEntryPath  = @"/entries/%d"; 
NSString const *APIUpdateEntryPath = @"/entries/%d/update"; 

sau đó tôi xây dựng các URL trong thời gian chạy cho từng API như sau:

- (void)updateEntryNumber:(NSUInteger)entryNumber 
{ 
    NSString *updateEntryPath = [NSString stringWithFormat:APIUpdateEntryPath, entryNumber]; 
    NSString *APIPath = [APIBasePath stringByAppendingPathComponent:updateEntryPath]; 
    // do something 
} 
+0

Tôi chỉ thấy rằng 'stringByAppendingPathComponent:' trả về chỉ một dấu gạch chéo, tức là 'http:/...', có vẻ như phương pháp này được sử dụng cho đường dẫn tệp, chứ không phải url. Thay vào đó, tôi sử dụng 'stringByAppendingString:'. :) – Kjuly

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