-1

ディスパッチ キューからグローバル NSMutableDictionary を使用しようとしています。ただし、アイテムは NULL に戻り続けます。

私がやろうとしているのは、dispatch_queue を使用して外部の json ファイルにアクセスし、この情報を UITableView に入力することです。

これが私が持っているものです

vc.h:

@interface viewcontroller {
 NSMutableDictionary *jsonArray;
}

vc.m:

    #define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1
    #define jsonTest [NSURL URLWithString:@"http://www.sometest.com/test.php"]

    -(void)viewDidLoad {
      dispatch_async(kBgQueue, ^{
            NSData* data = [NSData dataWithContentsOfURL:
                            jsonTest];
           [self performSelectorOnMainThread:@selector(fetchedData:)
                                   withObject:data waitUntilDone:YES];
            // if I run the log here, I can access jsonArry and the log prints correctly
            NSLog(@"City: %@", [jsonArray objectForKey:@"city"];
        });
    }

    -(NSMutableDictionary *)fetchedData:(NSData *)responseData {

        NSError *error;
        jsonArray = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
        return jsonArray;
    }

/********************* Table formatting area **********************/

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.ipTable) { 
        if ([ipArray count] == 0){
            return 1;
        } else { // meta table
            return [ipArray count];
        }
    } else { // IP Meta Data
        return [jsonArray count];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


    if (tableView == self.myTable) {
        NSString *CellIdentifier = NULL;
        if ([ipArray count] == 0) {
            CellIdentifier = @"No Cells";
        } else {
            CellIdentifier = @"IP Cell";
        }

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }

        if ([ipArray count] == 0)
        {
            [cell.textLabel setText:NSLocalizedString(@"None Found", nil)];
            return cell;

        } else {

        IPAddr *theip = [ipArray objectAtIndex: [indexPath row]];
        NSString *theipname = [theip ipName];
        if ([theipname isEqualToString:@""]) {
            [cell.textLabel setText: [theip ipNum]];
            [cell.detailTextLabel setText:NSLocalizedString(@"noName", nil)];
        } else {
            [cell.textLabel setText: [theip ipName]];
            [cell.detailTextLabel setText: [theip ipNum]];
        }
        return cell;
        }

    } else { // meta table

        static NSString *CellIdentifier = @"metaCell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }

        // jsonArray content would go here to fill the cells.
        /******************** something here to fill the cells using jsonArray ********************/
        return cell;
    }

} // END UITAbleViewCell

キュー内の jsonArray にアクセスすると、正常に返され、都市のログが出力されます。ただし、キューの外で使用しようとすると、NULL が返されます。

何が起こっているのかを理解しようとしていますが、何かアイデアはありますか?

同じビューのさまざまなメソッドで jsonArray を使用する必要があるため、グローバルにする必要があります。

4

3 に答える 3

0

nsnotification を介して他のメソッド (jsonarray を使用している) を呼び出してみてください...これを行う他のアイデア/方法があるかどうかはわかりませんが、私が考えていることを提示しています。

このコードを fetchedData メソッドの中に入れて、

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
            [nc addObserver:self selector:@selector(someMethod:) name:@"JSonDownloaded" object: jsonArray];
             [[NSNotificationCenter defaultCenter] postNotificationName:@"JSonDownloaded" object: jsonArray];

-(void)someMethod:(NSNotification *)nspk
{
    NSLog(@"%@",nspk.object);
//Only after this you can able to access the jsonArray.
}

オブザーバーを登録解除することを忘れないでください。

于 2013-08-22T04:40:57.880 に答える
0

jsonArray単なるインスタンス変数であり、プロパティではありません。したがって、オブジェクトを割り当ててもそれは保持されず、プログラムが実行ループに戻るとすぐにオブジェクトが解放される可能性があります。
iVar を@property (strong) NSMutableDictionary *jsonArray;and@synthesize jsonArray;で置き換え、EDIT でオブジェクトを割り当てることself.jsonArray = ... 勧めします
(下記の Martin R のコメントを参照)。プログラムが実行ループに戻るとすぐに。 この場合、iVar をandに置き換え、オブジェクトをそれに割り当てることをお勧めします。

@property (retain) NSMutableDictionary *jsonArray;@synthesize jsonArray;self.jsonArray = ...

于 2013-08-22T05:14:45.037 に答える