Các khóa học lập trình iOS Objective-C, lập trình iOS Swiftlập trình iOS Swift kết nối Web Service có sẵn toàn bộ mã nguồn, hướng dẫn chi tiết từng bước và được trình bày rất dễ hiểu.

Singleton là một design pattern căn bản. Singleton là một kiểu Class đặc biệt chỉ tạo ra duy nhất chỉ một đối tượng trong suốt vòng đời của ứng dụng

design pattern trong lập trình
UML của một Singleton Class

Chúng ta nên sử dụng Singleton trong trường hợp quản lý một loại dịch vụ nào đó, nên dùng chung giữa các màn hình:

  • DataObject class phụ trách đọc, ghi dữ liệu CoreData
  • GameManager class phụ trách toàn bộ kịch bản games: load level game vào ra sao, cài đặt các lựa chọn
  • ConfigureSettings class đọc ghi cấu hình dùng chung

Đối tượng AppDelegate cũng là một đối tượng chỉ được khởi tạo một lần duy nhất và có vòng đời bằng chính vòng đời của ứng dụng. Nhiều ví dụ mẫu (xem các ví dụ về CoreData) của chính Apple viết tận dụng tính chất này để coi nó như là một Singleton. Cách này chạy được nhưng nó khiến AppDelegate trở nên phức tạp, và lệch lạc về chức năng. Ví dụ ứng dụng có module CoreData, CoreLocation và phần quản lý cấu hình. Cả 3 chức năng này đều có dạng singleton. Viết tất cả các hàm của 3 module này vào AppDelegate khiến nó trở nên rối rắm, khó bảo trì. Nhờ có pattern Singleton chúng ta có thể khai báo 3 class Singleton tách biệt, dễ bảo trì, dễ dùng lại.

Học lập trình nâng cao trực tuyến
3 class chức năng đã được tách ra
@interface DataManager : NSObject 
@property (nonatomic, strong) NSString *someProperty;
+ (id)sharedManager;
@end
#import "DataManager.h"

@implementation DataManager

#pragma mark Singleton Methods
//Đừng gọi trực tiếp hàm này
- (id)init {
    if (self = [super init]) {
        _someProperty = @"Demo Singleton";
    }
    return self;
}

//Mà gọi class method này để lấy singleton của Class
+ (id)sharedManager {
    static DataManager *sharedDataManager = nil;
    static dispatch_once_t dispatchOnce;
    dispatch_once(&dispatchOnce, ^{
        sharedDataManager = [self new];
    });
    return sharedDataManager;
}
@end

Khi cần dùng đối tượng của DataManager (đối tượng này là duy nhất, singleton), chúng ta không được gọi [[DataManager alloc] init]  mà sử dựng class method [DataManager sharedManager]

DataManager *dataManagerA = [DataManager sharedManager];
NSLog(@"%p", dataManagerA);

//dataManagerB sẽ trỏ vào cùng địa chỉ với dataManagerA
DataManager *dataManagerB = [DataManager sharedManager];
NSLog(@"%p", dataManagerB);

Hàm dispatch_once là một hàm trong thư viện GCD (Grand Central Dispatch, chịu trách nhiệm điều phối hoạt động các thread đa nhiệm). Hàm này sẽ chỉ chạy đoạn mã block một lần duy nhất trong cả vòng đời của ứng dụng. Xem chi tiết hơn về hàm này ở đây
Link download mã nguồn
Bài viết này có tham khảo
http://www.galloway.me.uk/tutorials/singleton-classes/

Khóa học lập trình di động tại Techmaster:

Để cài đặt MacOSX lên phần cứng không phải Apple liên hệ chuyên gia cài Hackintosh:

  • Nguyễn Minh Sơn: 01287065634
  • Huỳnh Minh Sơn: 0936225565
  • Website: caidatmacos.com