читать лист из документов - PullRequest
0 голосов
/ 18 февраля 2012

У меня на сервере есть список для заполнения карты аннотациями.Когда я читаю его с сервера, все работает и создается копия файла plist по пути к документам.Я пытаюсь прочитать мой список в пути документов, когда нет подключения к интернету, но это не работает.Если я пишу в своем коде, чтобы перейти к пакету, когда нет Интернета - он работает, но из документов - нет.(я изменил только для вопроса путь к файлу plist в моем Dropbox) Что не так в моем коде?Спасибо за вашу помощь в продвинутом!

- (void) showMap 
{
storsInfosArr = [[NSArray alloc]initWithContentsOfURL:
                 [NSURL URLWithString:@"http://dl.dropbox.com/u/4082823/AppsFiles/test.plist"]];

NSString *error;
NSString *rootPath =
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];
NSString *plistPath = [rootPath stringByAppendingPathComponent:@"test.plist"];
NSArray *tmpArr = [NSArray arrayWithArray:storsInfosArr];
NSData *tmpData = [NSPropertyListSerialization dataFromPropertyList:tmpArr format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

if(tmpData)
{
    [tmpData writeToFile:plistPath atomically:YES];
}

else 

{
    NSLog(@"%@",error);
}

//Check if the array loaded from server is not complete, load from docs:
if(tmpArr.count == 0)
{
    NSString *rootPath =
    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];
    NSString *plistPath = [rootPath stringByAppendingPathComponent:@"stores.plist"];

    NSLog(@"docsPlistPath = %@",plistPath);

    // Build the array from the plist  
    NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:plistPath];
    self.storsInfosArr = tmpArray;
}

for (NSDictionary *currStoreDict in storsInfosArr)
{
    StoreAnnotation *stAnnotation = [[StoreAnnotation alloc] initWithDictionary:currStoreDict];
    [myMapView addAnnotation:stAnnotation];
}

myMapView.showsUserLocation = YES;

CLLocationCoordinate2D tmpCoord2d = {31.48489338689016, 35.5517578125};
MKUserLocation *userLocation = myMapView.userLocation;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate,390000.0, 390000.0);
[myMapView setRegion:region animated:NO];
myMapView.mapType = MKMapTypeStandard;
self.myMapView.centerCoordinate = tmpCoord2d;
}

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Привет следующий код поможет вам в чтении списков с NSDocumentDirectory:

if(netConnection==0)
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,    NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    if (!documentsDirectory) {
        NSLog(@"Documents directory not found!");
    }

    NSArray *myWords = [@"Data.plist" componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]];
    NSString *PlistFilePath = [documentsDirectory stringByAppendingPathComponent:[myWords lastObject]];

    NSLog(@"%@",PlistFilePath);

    NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:PlistFilePath];

    //Load Plist root element into Dictionary object Fist

    self.dataDict = tempDict;

    [tempDict release];

    //From DataDict retrieve the Array 
}
0 голосов
/ 06 марта 2012

Корневой элемент plist должен быть загружен в словарную переменную перед доступом к другим объектам.

<plist version="1.0">
  <dict>
  <key>Levels</key> //this is Root Element

  <array>
  <dict>
 <key>Title</key><string>Screen Based Videos</string>
  </dict>

  <dict>
  <key>Title</key><string>Action Based Videos</string>
  </dict>

   </array>
   </dict>
   </plist>

Сначала создайте переменную словаря в классе делегата приложения.

 .h AppDelClass

NSDictionary *DataDict;

@property(nonatomic,retain)  NSDictionary *DataDict;



.M AppDelClass

@sythesize DataDict;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

Check Network Connection using Rechability Class form Apple Doc

NSURL *XmlDataURL=[NSURL URLWithString:@"http://example.com/ideploy/testing/Data.plist"];


if(NetConnection==YES)
{


   theRequest = [NSURLRequest requestWithURL:XmlDataURL    cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
    receivedData = [[NSMutableData alloc] initWithLength:0];
    Connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self  startImmediately:YES];

}

else
{


   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,   NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];
    if (!documentsDirectory){
        NSLog(@"Documents directory not found!");
    }
    NSArray *myWords = [@"Data.plist" componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"`]];
NSString *PlistFilePath = `[documentsDirectory stringByAppendingPathComponent:[myWords lastObject]];

NSLog(@"%@",PlistFilePath);

NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:PlistFilePath];

//Load Plist root element into Dictionary object Fist

 self.dataDict = tempDict;

[tempDict release];

}

//Root Class Implementation
 .h file

NSArray *tableDataSource;

@property (nonatomic, retain) NSArray *tableDataSource;

.M file

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

     NSArray *tempArray = [[NSArray alloc] init];
    self.tableDataSource = tempArray;
   [tempArray release];

 RootClassAppDelegate *AppDelegate = (RootClassAppDelegate *)[[UIApplication  sharedApplication] delegate];

 self.tableDataSource = [AppDelegate.data objectForKey:@"Levels"];

     NSLog(@"%i",[tableDataSource count]);

// form the tableDataSource Array you can Access remaining elemements


}
...