2014-06-26 60 views
0

我目前正在拉取與其綁定位置信息的「比賽」對象列表。我想監視我在附近的所有比賽。通過委託方法攜帶自定義屬性

 for(Contest *contest in contests) { 

      NSMutableDictionary * fence1 = [NSMutableDictionary new]; 
      [fence1 setValue:contest.event.name forKey:@"identifier"]; 
      [fence1 setValue:[NSString stringWithFormat:@"%f", contest.location.latitude] forKey:@"latitude"]; 
      [fence1 setValue:[NSString stringWithFormat:@"%f", contest.location.longitude] forKey:@"longitude"]; 
      [fence1 setValue:@"1000" forKey:@"radius"]; 

      //the below method returns a CLRegion object 
      CLRegion *region = [self dictToRegion:fence1]; 

      //adding custom contest object to region 
      region.contest = contest; 

      [self.locationManager requestStateForRegion:region]; 
     } 

我也想自定義比賽財產綁在區域(如上面的代碼所示),但它似乎並沒有在委託方法didDetermineState結轉:

-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region { 
switch (state) { 
    case CLRegionStateUnknown: 
     NSLog(@"Unknown state!"); 
     break; 

    case CLRegionStateInside: 
     NSLog(@"Inside state!"); 

     //this comes back as null 
     NSLog(@"%@", region.contest.name); 

     break; 

    case CLRegionStateOutside: 
     NSLog(@"Outside state!"); 
     break; 

    default: 
     break; 
} 
} 

在委託方法中,region.contest返回爲(null)。有更好的方法嗎?

附錄(我的類別CLRegion): CLRegion + Contest.h:

#import <CoreLocation/CoreLocation.h> 
#import "Event.h" 
#import "Contest.h" 

@interface CLRegion (Loopd) 

@property (nonatomic, strong) Event *event; 
@property (nonatomic, strong) Contest *contest; 

@end 

CLRegion + Contest.m:

#import "CLRegion+Loopd.h" 
#import <objc/runtime.h> 

static char defaultHashKey; 

@implementation CLRegion (Loopd) 

@dynamic event; 
@dynamic contest; 

-(Event*) event { 
    return objc_getAssociatedObject(self, &defaultHashKey); 
} 

- (void) setEvent:(Event *)event { 
    objc_setAssociatedObject(self, &defaultHashKey, event, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

-(Contest*) contest { 
    return objc_getAssociatedObject(self, &defaultHashKey); 
} 

- (void) setContest:(Contest *)event { 
    objc_setAssociatedObject(self, &defaultHashKey, event, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 


@end 

回答

1

有2個問題,你的類別。 1.您對兩個屬性都使用相同的密鑰。 2. defaultHashKey用0值初始化。

objc_getAssociatedObject和objc_setAssociatedObject的工作方式大多像setValue:forKey:和getValueForKey :.所以你需要提供將值綁定到對象的鍵。嘗試類似的東西:

#import "CLRegion+Loopd.h" 
#import <objc/runtime.h> 

static char* kEventKey = "kEventKey"; 
static char* kContestKey = "kContestKey"; 

@implementation CLRegion (Loopd) 

@dynamic event; 
@dynamic contest; 

-(Event*) event { 
    return objc_getAssociatedObject(self, kEventKey); 
} 

- (void) setEvent:(Event *)event { 
    objc_setAssociatedObject(kEventKey, event, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

-(Contest*) contest { 
    return objc_getAssociatedObject(self, kContestKey); 
} 

- (void) setContest:(Contest *)event { 
    objc_setAssociatedObject(self, kContestKey, event, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

@end 

此代碼應工作,但會好得多用於存儲這種關聯(我不使用運行時爲這種目的的一大風扇)創建單獨的對象。

編輯: 您在for循環中多次分配比賽值。因此,其中一個比賽(最後一個)被分配給CLRegion對象。

+0

所以這通常是一個不好的方法?順便說一句,我仍然爲關聯的對象爲空。 – Allen

+0

我確認它使用你的代碼設置/獲取作品,但是在被調用的委託方法中,競爭對象不再與從委託方法返回的區域對象關聯 – Allen

+0

我意識到委託方法不會返回相同的對象...所以似乎沒有很好的解決這個問題的方法! – Allen