2015-06-05 96 views
2

過去4天一直在嘗試獲取要調用的PFUser位置的代碼,然後將該位置拉到「位置」。從接收該「位置」,我希望根據用戶位置以升序對照片陣列進行排序。但是,用戶位置未正確填充,並且以PFUser位置nil結束。PFUser當前位置按最近的上升位置對數組進行排序

(NSArray *)caches { 

    PFGeoPoint *userGeoPoint = [PFUser currentUser][@"location"]; 

    PFQuery *query = [Cache query]; 

    [query whereKey:@"location" nearGeoPoint:userGeoPoint withinMiles:20]; 
    query.limit = 20; 

    NSMutableArray *photoArray = [[query findObjects] mutableCopy]; 

    [PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, 
    NSError *error){ 

    if (!error) { 

     [[PFUser currentUser] setObject:geoPoint forKey:@"currentLocation"]; 
     [[PFUser currentUser] saveInBackground]; 
    } 
    }]; 

    return photoArray; 
} 
+0

請格式化您的代碼以便易於閱讀。 – Nilambar

回答

0

有與方式,你正在試圖做的那幾個問題:

  1. 您正在使用findObjects()同步讀取查詢結果。這將阻塞主線程直到返回結果。您應該使用findObjectsInBackgroundWithBlock()。
  2. 由於您正在使用異步方法獲取查詢結果的位置和 同步方法,因此在保存用戶的位置之前,您的查詢將始終完成。
  3. 您每次獲取照片時都要查詢用戶的位置,而不是使用保存的值。理想情況下,您希望事先保存用戶的位置(可能在應用程序啓動時),以便在查詢時設置它。您甚至可以設置一個計時器,以便每分鐘或每隔一段時間更新用戶的位置。
  4. 您正在查詢「位置」列但保存「currentLocation」。確保您使用相同的列名稱來設置和檢索位置。

這就是我建議的做法。

- (void)updateUserLocation { 
    [PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) { 
     if (!error) { 
      [[PFUser currentUser] setObject:geoPoint forKey:@"location"]; 
      [[PFUser currentUser] saveInBackground]; 
     } 
    }]; 
} 

然後,當你需要得到的照片,調用這個函數在後臺獲取的照片:在啓動應用程序在後臺更新用戶的位置調用此函數

- (void)getPhotosInBackground:(void (^)(NSArray *photos, NSError *error))block { 
    PFGeoPoint *userGeoPoint = [PFUser currentUser][@"location"]; 

    PFQuery *query = [Cache query]; 
    [query whereKey:@"location" nearGeoPoint:userGeoPoint withinMiles:20]; 
    [query setLimit:20]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     block(objects, error); 
    }]; 
}