2011-09-15 3 views
2

iPhone 용 멀티 스레드 응용 프로그램을 작성 중이며 NSLock을 사용하여 파일에서 사운드를로드하는 것과 같은 일부 작업이 원자 단위로 작동하는지 확인합니다. 응용 프로그램의 다른 부분에서 잠금을 간단하게하기 위해 NSString에 이름을 전달하는 것만으로 잠금을 설정하고 잠금을 해제 할 수있는 다음과 같은 클래스를 작성했습니다. 그러한 잠금이 존재하지 않으면 잠금이 만들어지고 나중에 저장됩니다. 난 그것을 테스트하고 그것은 (NSLock 개체에 대한 액세스를 제공하고 그들의 행동을 변경하지 않는 것처럼) 잘 작동하는 것 같습니다.NSLock "controller"클래스

내 질문은 : 그러한 클래스를 갖고 사용하는 것이 좋습니까? 아니면 자물쇠 개념에 오해가 있습니까?

Locker.h 

#import <Foundation/Foundation.h> 

@interface Locker : NSObject { } 

+ (void) purgeLocks; 
+ (NSLock*) lockWithName: (NSString*) name; 
+ (void) lock: (NSString*) name; 
+ (void) unlock: (NSString*) name; 
+ (BOOL) tryLock: (NSString*) name; 

@end 



Locker.m 

#import "Locker.h" 

static NSMutableDictionary* locks = nil; 

@implementation Locker 

+ (void) initialize { 
    locks = [[NSMutableDictionary dictionary] retain]; 
} 

+ (void) purgeLocks { 
    [locks release]; 
    [Locker initialize]; 
} 

+ (NSLock*) lockWithName: (NSString*) name { 
    NSLock* lock = nil; 
    @synchronized([Locker class]) { 
     lock = [locks objectForKey: name]; 
     if(!lock) { 
      lock = [[[NSLock alloc] init] autorelease]; 
      [lock setName: name]; 
      [locks setObject: lock forKey: name]; 
     } 
    } 
    return lock; 
} 

+ (void) lock: (NSString*) name { 
    [[Locker lockWithName: name] lock]; 
} 

+ (void) unlock: (NSString*) name { 
    [[Locker lockWithName: name] unlock]; 
} 

+ (BOOL) tryLock: (NSString*) name { 
    return [[Locker lockWithName: name] tryLock]; 
} 

@end 

답변

0

이것은 매우 무겁습니다. 디자인을 단순화 할 수 없습니까? (GCD가 떠오른다.) 거의 모든 iOS 응용 프로그램은 멀티 스레드 된 응용 프로그램이며 IMHO는 사용자가 작성한 잠금 도우미를 보는 것이 거의 없습니다. KISS principle이 빛나는 곳이 있다면, 멀티 스레딩이라고 확신합니다.

+0

감사합니다. GCD를 살펴 봅니다. 위는 단지 내 마음에 처음 온 것입니다. 내가 다루고있는 주된 문제는 사용자가 재생 버튼을 누르면 다른 스레드의 파일에서 사운드를로드하기 시작하지만 사용자가 빨리 정지 버튼을 누르면 사운드가 여전히로드됨에 따라이 메시지가 쓸모 없게됩니다. 마지막으로로드되면 재생이 시작되고 이미 필요하지 않습니다. 나는 같은 스레드에서 모든 관련 메서드를 시작하려고했지만 몇 가지 문제가 발생했습니다. 키스 (KISS)는 위대하다. 때로는 알기가 어렵다. 간단하거나 간단하지 않다. :) 웬일인지,이 코드는 나에게 단순 해 보인다. – Least

+0

세부 정보를 모르지만 전달 대기열은 내가 말하는 내용과 잘 어울립니다. (모든 제어 메시지를 하나의 직렬 대기열로 보내면 오디오가로드되기 전에 중지 이벤트가 발생하지 않습니다.) KISS 원칙을 벗어나는 것에 대한 징후는 클래스 메소드, 도우미 "매니저"오브젝트와 다중 잠금. YMMV. – zoul

1

@synchronized is slow. + initialize에 잠금 장치를 할당하고 대신 그 잠금 장치를 사용하십시오. 하지만 클래스 메서드를 사용하는 대신 싱글 톤을 사용하기로했습니다.하지만 그 정도는 맛의 문제입니다.

접근 방식의 주요 단점은 다른 잠금을 얻으려면 잠금을 잠 가야한다는 것입니다. 무겁게 다중 스레드 된 응용 프로그램에서 스레드가 모두 다른 잠금에 액세스하려는 경우에도이 메타 잠금 (현재 @synchronized)은 성능 병목 현상이 될 수 있습니다.