我有一些對象,更準確地說是模型,它們的某些屬性被延遲加載,即在讀取時從服務器獲取。目前,我運用經典技術,例如Objective-C:惰性加載的模型模式
@synthetize description = _description;
- (NSString *)description {
if (!_description) {
NSError *error = nil;
_description = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding
error:&error];
if (error) {
_description = nil;
// error handling
}
}
return _description;
}
但是,它涉及很多代碼重複。當然,我仍然可以有一個通用的方法來做這件事,並在所有的getter中調用這個方法(這就是我所做的)。但你有更好的主意嗎?
編輯:使註釋中所建議的代碼更安全。這裏是另一個建議:
@synthesis description = _description;
- (NSString *)descriptionWithCompletion:(void (^)(NSString *description, NSError *error))completion {
if (!_description) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSError *error = nil;
_description = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding
error:&error];
if (error) _description = nil;
completion(_description, error);
});
}
completion(_description, nil);
}
這不是一個好的模式!您的調用者無法處理由此產生的錯誤,並且在網絡訪問完成之前阻止調用線程。這是一個非常好的方式來讓用戶界面口吃,並讓你的應用被操作系統殺死。您可能想要向模型的用戶指示訪問這些值的過程是異步的,並且可能會因爲它們傳遞給您一個完成塊(它帶有一個可選錯誤)而失敗。 – 2014-09-27 14:32:55
所以,你建議讓用戶把一個完成塊傳給getter。然後,在後臺隊列中分派獲取進程,後臺隊列將以對象和錯誤爲參數調用完成塊。我對嗎? – user1553136 2014-09-27 14:43:51
是的,確切地說。但是,這對調用者來說有些痛苦,所以如果可能的話,您可能希望減少這些異步方法的數量,例如通過一次加載整個模型。 – 2014-09-27 14:49:32