對於學習iOS編程,我正在開發用於共享圖像的iPhone應用程序。該應用程序是網站的客戶端。iPhone會檢查用戶是否在整個應用程序中登錄
在該方法中didFinishLaunchingWithOptions
我檢查,如果用戶已經登錄。 如果用戶沒有登錄,他仍然可以看到應用程序的所有部分,但例如他不會看到選項按鈕編輯配置文件,對圖像的評論等。
如何在所有視圖控制器中共享記錄/不記錄狀態?
對於學習iOS編程,我正在開發用於共享圖像的iPhone應用程序。該應用程序是網站的客戶端。iPhone會檢查用戶是否在整個應用程序中登錄
在該方法中didFinishLaunchingWithOptions
我檢查,如果用戶已經登錄。 如果用戶沒有登錄,他仍然可以看到應用程序的所有部分,但例如他不會看到選項按鈕編輯配置文件,對圖像的評論等。
如何在所有視圖控制器中共享記錄/不記錄狀態?
更新:如果今天給這個建議,我會說使用一個共享的實例:
@interface SomeClass: NSObject
{
+(SomeClass *)shared;
}
@implementation SomeClass
{
+(SomeClass *)shared {
static SomeClass *shared;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [SomeClass new];
});
return shared;
}
}
然後,它是自動實例化,你在第一次使用,和可用在您的應用程序:
[[SomeClass shared] doSomething];
您可以使用單例 - 一個對象的全局共享實例。
@interface SomeClassSingleton : NSObject {
}
+(SomeClass*)sharedSomeClass;
+(void)setSharedSomeClass:(SomeClass*)someObject;
@end
@implementation SomeClassSingleton
static SomeClass* _someObject = nil;
+(SomeClass*)sharedSomeClass
{
return _someObject;
}
+(void)setSharedSomeClass:(SomeClass*)someObject
{
@syncrhonized(self)
{
_someObject = someObject;
}
}
@end
然後,當你需要訪問在另一個源文件中的對象,則導入頭文件的單身在其他的頭,就像使用其他任何引用。
創建一個單例:
SomeClass* someObject = [[SomeClass alloc] init];
[SomeClassSingleton setSharedSomeClass:someObject]; // write to save your singleton
使用/讀取單:
[[SomeClass sharedSomeClass] someSharedClassMessage];
// OR
SomeClass* someObject = [SomeClass sharedSomeClass];
或者,你可以創建一個單獨實現,自動inits你第一次訪問:
@implementation SomeClassSingleton
static SomeClass* _someObject = nil;
+(SomeClass*)sharedSomeClass
{
@synchronized(self) {
if (_someObject == nil) {
_someObject = [[SomeClass alloc] init];
}
}
return _someObject;
}
@end
把它放在一個像應用程序委託的單例中,或者作爲一個模型對象(如用戶數據)中的瞬態值,它可以看到任何東西。
如果您分配BOOL屬性添加到您的應用程序委託,你可以得到這樣的:
myApplicationDelegate *myDelegate = (myApplicationDelegate*)[[UIApplication sharedApplication] delegate];
myDelegate.userLoggedIn = YES;
我是一個新手iOS開發人員,我從來沒有使用單身或模型對象。你能給我一些提示(文章,如果你知道某人)使用它嗎?謝謝你,兄弟! –
我會爲你編輯上面的答案。 –
嘿,謝謝你的回答。爲什麼同步? –
'@ syncrhonized'是爲了線程安全。在像iOS這樣的多線程環境中,您需要確保一個共享對象不會被多個線程同時修改。一個靜態的對象,或者像這裏實現的單例,在內存中只存在一個副本。 '@ synchronized'鎖定你傳遞給它的對象,從而在線程間「同步」對它的訪問,這樣任何試圖在鎖定時訪問它的線程都必須等待,直到鎖被打開。這是一個基本的「阻塞」機制,阻止第二個線程在設置鎖定時繼續執行。 – nekno
謝謝你好老兄! –